我正在尝试创建一个String[]
,其中只包含由某些字符组成的单词。例如,我有一个字典,其中包含许多单词,如:
臂 军队 艺术 如 在 攻击 尝试 注意 引力 权威 自动 苏醒 宝宝 背部 坏 袋 平衡
我希望缩小列表范围,使其仅包含带有a
,b
和g
字符的字词。因此,在此示例中,列表应仅包含单词“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正则表达式是确切的单词!有任何想法吗?如果需要,我可以发布更多代码...我想我必须尝试初始化正则表达式错误。 缩小列表必须仅包含正则表达式中的字符。
答案 0 :(得分:2)
正则表达式able
仅匹配字符串"able"
。但是,如果您希望正则表达式与a
,b
,l
或e
中的任一字符匹配,那么您要查找的正则表达式为[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]
匹配您希望字符串组成的字符,在本例中为a
,b
,l
和e
。 +
确保字符串中有1个或多个这些字符。
注意:此正则表达式将匹配包含这4个字母的字符串。例如,它将匹配:
能够,但是,alble,aaaabbblllleeee
且不匹配
qable,treatable and abled。
答案 3 :(得分:0)
一个示例正则表达式,用于过滤掉至少包含一个集合中所有字符的单词。这将匹配任何包含所有字符a,b,g的至少一次出现的英语单词(不区分大小写):
(?i)(?=.*a)(?=.*b)(?=.*g)[a-z]+
匹配的字符串示例为bag
,baggy
,grab
。
不匹配的字符串示例为big
,argument
,nothing
。
(?i)
表示打开不区分大小写的标记。
对于每个字符,您需要添加与集合中字符数一样多的(?=.*<character>)
。
我假设一个单词只包含英文字母,所以我指定[a-z]
。如果需要空格,连字符等,请指定更多
我假设matches(String regex)
类中的String
方法,因此我省略了^
和$
。
性能可能不好,因为在最坏的情况下(在单词的末尾找到字符),我认为正则表达式引擎可能会通过大约n次的字符串,其中n是集合中的字符数。它可能根本不是一个真正的问题,因为这些词很短,但如果事实证明这是一个瓶颈,你可以考虑做一个简单的循环。