正则表达式捕获无数字或符号的单词

5

我需要一些正则表达式来处理以下字符串:

"test test3 t3st test: word%5 test! testing t[st"

只匹配a-z字符中的单词:

应匹配:test testing

不应匹配:test3 t3st test: word%5 test! t[st

我尝试过([A-Za-z])\w+,但是word%5不应该匹配。


1
你期望匹配的单词是什么? - azro
2
你为什么想让“word%5”匹配? - Alain-Michel Chomnoue N
抱歉表述不清,我编辑了问题。 - Digao
1
(?<!\S)[a-z]+(?!\S) 用于查找仅包含a-z的单词。(?<!\S)(?:[a-z]*[^a-z\s])+[a-z]*(?!\S) 用于查找其他类型的单词。(?<!\S)(?:([a-z]+)|((?:[a-z]*[^a-z\s])+[a-z]*))(?!\S) 可以同时查找两种类型的单词(组1和组2表示哪种类型)。 - user557597
2个回答

4

您可以使用

String patt = "(?<!\\S)\\p{Alpha}+(?!\\S)";

请看正则表达式演示

它将匹配由空白字符或字符串的开头/结尾包围的一个或多个字母。另一种模式是(?<!\S)[a-zA-Z]+(?!\S)(与上面的相同),或者(?<!\S)\p{L}+(?!\S)(如果您想同时匹配所有Unicode字母)。

详细信息

  • (?<!\\S) - 否定回顾,在当前位置左边紧邻一个非空格字符,匹配失败
  • \\p{Alpha}+ - 匹配1个或多个ASCII字母(相当于[a-zA-Z]+, 如果您使用Pattern.UNICODE_CHARACTER_CLASS修改器标志,则\p{Alpha}将能够匹配Unicode字母)。
  • (?!\\S) - 否定前瞻,在当前位置右边紧邻一个非空格字符,匹配失败。
请查看Java演示:
String s = "test test3 t3st test: word%5 test! testing t[st";
Pattern pattern = Pattern.compile("(?<!\\S)\\p{Alpha}+(?!\\S)");
Matcher matcher = pattern.matcher(s);
while (matcher.find()){
    System.out.println(matcher.group(0)); 
} 

输出: testtesting

谢谢Wiktor,那么匹配与此相反的正则表达式是什么?我的意思是,没有匹配的字符串剩余部分是什么? - Digao
1
@Digao:抱歉,那么输出会是什么呢?2个项目: ["test3 t3st test: word%5 test!", "t[st]"] 还是 6个项目 ["test3", "t3st", "test:", "word%5", "test!", "t[st"] - Wiktor Stribiżew
1
我猜你想要这个来获得“相反”的结果。 - Wiktor Stribiżew
1
看起来有一种方法可以匹配那些项而不需要使用前瞻,你也可以使用"(?:\\S*[^\\s\\p{Alpha}])+\\S*"。它只匹配任何非空白字符块,并带有一个既不是空格也不是字母的强制字符。 - Wiktor Stribiżew

1

试试这个

Pattern tokenPattern = Pattern.compile("[\\p{L}]+");

[\\p{L}]+ 这将打印字母组


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接