创建仅包含特定字符的String []

时间:2013-01-06 17:55:12

标签: java regex

我正在尝试创建一个String[],其中只包含由某些字符组成的单词。例如,我有一个字典,其中包含许多单词,如:

臂 军队 艺术 如 在 攻击 尝试 注意 引力 权威 自动 苏醒 宝宝 背部 坏 袋 平衡

我希望缩小列表范围,使其仅包含带有abg字符的字词。因此,在此示例中,列表应仅包含单词“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;
}

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

4 个答案:

答案 0 :(得分:2)

正则表达式able仅匹配字符串"able"。但是,如果您希望正则表达式与able中的任一字符匹配,那么您要查找的正则表达式为[able] (括号内的)。如果您想要包含多个此类字符的字词,请添加+以重复该模式:[able]+

答案 1 :(得分: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();
}

答案 2 :(得分:1)

  

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

如果是这种情况,我认为最简单的方法是逐个字符地遍历整个字符串,并检查它是否包含您想要的所有字符。保持标记以查看是否找到每个字符。

如果不是这样的话......:

尝试使用正则表达式:

^[able]+$

以下是它的作用:

^匹配字符串的开头,$匹配字符串的结尾。这可以确保您没有获得部分匹配。

[able]匹配您希望字符串组成的字符,在本例中为able+确保字符串中有1个或多个这些字符。

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

能够,但是,alble,aaaabbblllleeee

且不匹配

qable,treatable and abled。

答案 3 :(得分:0)

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

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

匹配的字符串示例为bagbaggygrab

不匹配的字符串示例为bigargumentnothing

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

对于每个字符,您需要添加与集合中字符数一样多的(?=.*<character>)

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

我假设matches(String regex)类中的String方法,因此我省略了^$

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