2013-01-06 170 views
0

我想创建一个仅包含某些字符的单词的String[]。比如我有一个包含多个字的,像这样一本字典:在 攻击 尝试 关注 吸引力 权威 自动 清醒 婴儿 回 坏 袋 创建只包含某些字符的字符串[]

手臂 军队 艺术 为 余额

我想缩小列表的范围,以便它只包含单词字符a,bg。因此在这个例子中列表应该只包含'bag'这​​个词。 目前我正在尝试使用正则表达式来做这件事,但是在我似乎无法使它正常工作之前从未使用它们。 这里是我的代码:

public class LetterJugglingMain { 
public static void main(String[] args) { 
    String dictFile = "/Users/simonrhillary/Desktop/Dictionary(3).txt"; 
    fileReader fr = new fileReader(); 
    fr.openFile(dictFile); 
    String[] dictionary = fr.fileToArray(); 
    String regx = "able"; 
    String[] newDict = createListOfValidWords(dictionary, regx); 
    printArray(newDict); 
} 

public static String[] createListOfValidWords(String[] d, String regex){ 
    List<String> narrowed = new ArrayList<String>(); 
    for(int i = 0; i<d.length; i++){ 
     if(d[i].matches(regex)){ 
      narrowed.add(d[i]); 
      System.out.println("added " + d[i]); 
     } 
    } 
    String[] narrowArray = narrowed.toArray(new String[0]); 
    return narrowArray; 
} 

但返回的数组始终是空的,除非字符串的正则表达式是确切的词!有任何想法吗?如果需要,我可以发布更多的代码......我想我必须尝试初始化正则表达式错误。 缩小列表只能包含来自正则表达式的字符。

+1

您可能需要预见性。不过,我宁愿在字符串中循环。 – nhahtdh

+0

你应该考虑使用番石榴,更具体地说,它的'CharMatcher'。 – fge

回答

1

OP要包含每个字符的单词。不只是其中之一。 等字符不成问题。

如果是这种情况,我认为最简单的方法是循环整个字符串,逐个字符,并检查它是否包含所有你想要的字符。保持标志检查并查看是否找到了每个角色。

如果是这种情况并非如此....:

尝试使用正则表达式:

^[able]+$ 

这里就是它的作用:

^字符串和$的开头匹配匹配字符串的结尾。这确保你没有得到部分匹配。

[able]你希望字符串组成的字符匹配,在这种情况下able+确保字符串中有一个或多个这些字符。

注:此正则表达式将匹配包含这4个字母的字符串。例如,它会匹配:

能,ALBE,aeble,aaaabbblllleeee

,并不会匹配

qable,可治疗和体健。

+1

OP需要包含每个字符的单词。不只是其中之一。其他角色不是问题。 –

+0

@Michael我的程序也需要为许多不同的字母组做这个,我假设这是可能的,如果我创建了一个像这样的“^ [] + $”的模板字符串,并且只需在括号之间放置所需的字母? –

+0

是的,只要那是你想要的结果,那就行得通了。如果@ JBNizet是正确的,那么这是行不通的。 – Michael

2

正则表达式able将只匹配字符串"able"。然而,如果你想要一个正则表达式匹配a,b,le这两个字符,你正在寻找的正则表达式是[able](括号内)。如果您想要包含多个此类字符的单词,请添加+以重复该模式:[able]+

+3

OP需要包含每个字符的单词。不只是其中之一。 –

0

这是一个示例正则表达式,用于过滤出至少包含一个集合中所有字符出现的单词。这将匹配包含所有字符中的至少一个发生的a,b任何英文单词(不区分大小写),G:匹配将是bagbaggygrab的字符串的

(?i)(?=.*a)(?=.*b)(?=.*g)[a-z]+ 

实施例。

不匹配字符串的示例将是big,argument,nothing

(?i)表示开启不区分大小写的标志。

对于每个字符,您需要为集合中的字符数添加尽可能多的(?=.*<character>)

我假设一个字只包含英文字母,所以我指定[a-z]。指定更多,如果你需要的空间,连字符等

我认为matches(String regex)方法String类,所以我省略了^$

性能可能是坏,因为在最坏的情况下(字符在单词的结尾处找到),我认为的正则表达式引擎可能会通过串周边的n次,其中n是集合中的字符数。这可能不是一个真正的问题,因为这些词很短,但如果事实证明这是一个瓶颈,你可能会考虑做简单的循环。

2

坦率地说,我不是正则表达式的专家,但我不认为它是做你想做的最好的工具。我会使用类似以下的方法:

public boolean containsAll(String s, Set<Character> chars) { 
    Set<Character> copy = new HashSet<Character>(); 
    for (int i = 0; i < s.length() && copy.size() < chars.size(); i++) { 
     char c = s.charAt(i); 
     if (chars.contains(c)) { 
      copy.add(c); 
     } 
    } 
    return copy.size() == chars.size(); 
} 
相关问题