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;
}

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

4

4 回答 4

2

正则表达式able将仅匹配字符串"able"。但是,如果您希望正则表达式匹配、或的任一字符a,则您要查找的正则表达式是(在括号中)。如果您想要包含多个此类字符的单词,请添加一个用于重复该模式的单词:.ble[able]+[able]+

于 2013-01-06T17:58:10.287 回答
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();
}
于 2013-01-06T18:13:28.277 回答
1

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

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

如果不是这种情况....:

尝试使用正则表达式:

^[able]+$

这是它的作用:

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

[able]匹配您希望字符串包含的字符,在本例a中为bl、 和e. +确保字符串中有 1 个或多个这些字符。

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

能, albe, aeble, aaaabbblllleeee

并且不会匹配

qable,可治疗的和有能力的。

于 2013-01-06T17:58:11.973 回答
0

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

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

匹配的字符串示例为bag, baggy, grab

不匹配的字符串示例为big, argument, nothing.

(?i)方法打开不区分大小写的标志。

您需要(?=.*<character>)为每个字符附加与集合中的字符数一样多的字符。

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

我在课堂上假设matches(String regex)方法String,所以我省略了^and $

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

于 2013-01-06T18:08:35.460 回答