【发布时间】:2015-10-08 13:28:28
【问题描述】:
我正在尝试查找字符串中包含 3 个字母的所有单词。
所以在这个列表中
cat monkey dog mouse
我只想要
cat dog
这是我的表情:
^[a-zA-Z]{3}$
我用不同的在线正则表达式测试器对其进行了测试,但没有一个符合我的表达方式。
【问题讨论】:
我正在尝试查找字符串中包含 3 个字母的所有单词。
所以在这个列表中
cat monkey dog mouse
我只想要
cat dog
这是我的表情:
^[a-zA-Z]{3}$
我用不同的在线正则表达式测试器对其进行了测试,但没有一个符合我的表达方式。
【问题讨论】:
【讨论】:
\b 并不是 100% 可靠的。所以我推荐的是使用像这样的前瞻/后视:(?<!\w)\w{3}(?!\w)
\b 仅适用于基本的拉丁符号时,所有流行的都支持前瞻/后瞻。所以它完全不适合西里尔文。
\b 仍然不适合。可能有些人必须使用捕获组。
如果你想匹配任何字符(也包括数字),你可以使用. 而不是[a-zA-Z]:
\b.{3}\b
【讨论】:
要匹配字符串中包含 3 个字母的所有单词,模式需要 成为 "\b[a-zA-Z]{3}\b"
下一步是编译你的模式。
Pattern pattern = Pattern.compile("\\b[a-zA-Z]{3}\\b");
使用匹配器并使用 find() 和 group() 方法打印匹配项
for (String word : sentence) {
Matcher matcher = pattern.matcher(word);
while(matcher.find()) {
System.out.println(matcher.group());
}
}
您的程序应该类似于 -
public static void main(String[] args) {
List<String> sentence = new ArrayList<String>();
sentence.add("cat");
sentence.add("monkey");
sentence.add("dog");
sentence.add("mouse");
Pattern pattern = Pattern.compile("\\b[a-zA-Z]{3}\\b");
for (String word : sentence) {
Matcher matcher = pattern.matcher(word);
while(matcher.find()) {
System.out.println(matcher.group());
}
}
}
【讨论】:
这对我有用。
grep -e "\b...\b" all-words.txt
这也有效:
grep -E "\b.{3}\b" all-words.txt
【讨论】:
另一个建议是使用这种模式:
\b\S{3}\b
为了避免匹配 3 个空格。 此模式也将匹配,例如,西里尔字母。
【讨论】: