java - 使用正则表达式从句子中查找带有 [a-zA-Z] 的单词

标签 java regex

我正在尝试使用正则表达式获取句子中的所有单词,但仅使用 [a-zA-Z] 的单词。 所以对于“我是男孩”,我想要 {"I", "am", "a", "boy"} 但是对于“I a1m a b*y”,我想要{“I”、“a”},因为“a1m”和“b*y”包含 [a-zA-Z] 以外的字符。

所以为了我得到的话,我正在尝试检查

  1. 如果在字符串的开头,那么我只检查单词后是否有空格
  2. 否则单词前后有一个空格
  3. 如果是最后一个单词,则检查单词前是否有空格。

所以我最终在 Java 中得到了这样的东西:

Pattern p = Pattern.compile("^[a-zA-Z]+ |^[a-zA-Z]+$| [a-zA-Z]+$| [a-zA-Z]+");
Matcher m = p.matcher("i am good");
while(m.find()) System.out.println(m.group());

但是,我只得到“i”和“good”。 因为当我得到“i”时,“i”后面有一个空格。 所以剩下的字符串是“很好” 由于“am”不在字符串的开头,单词前也没有空格,因此不会返回。

你们能对此提供任何反馈吗? 有没有办法只查看下一个字符而不返回空格?

最佳答案

假设您的正则表达式引擎支持前瞻/后视断言,您可以使用如下内容:

(^|(?<= )[a-zA-Z]+($|(?= ))

下面是对每个组件的作用的简要描述:

(^|(?<= )) :这表示“如果一个词从这里开始,我们就会感兴趣”。具体来说,
^ : 匹配行首,或者
(?<= ) : 匹配前面有空格的任何点,而不实际消耗空格本身。这称为积极的回顾断言。

[a-zA-Z]+ : 这应该是显而易见的,但它匹配任何连续的 ASCII 字母字符。

($|(?= )) :这说“如果这个词在这里完成,我们就完成了”。具体来说,
$ : 匹配行尾,或者
(?= ) : 匹配任何后跟空格的点,而不实际消耗空格本身。这称为积极的先行断言。


请注意,此特定正则表达式不会将后跟标点符号的单词视为一个单词。这实际上可能不是您想要的,但您描述了检查空格,这就是正则表达式的作用。如果你想支持后面跟着简单标点符号的单词,你可以将最后一个原子修改为

($|(?=[ .,!?]))

如果单词后跟空格、句点、逗号、感叹号或问号,它将匹配该单词。如果你愿意,你也可以更详细。

关于java - 使用正则表达式从句子中查找带有 [a-zA-Z] 的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8875750/

相关文章:

c# - 我需要帮助在 C# 中显示文本文件中的单词(字符串)

javascript - 如何编写正则表达式从 URL 获取参数

java - 在运行时获取java字段和方法描述符

java - 如何加入Pig输出文件?

java - MyClass.class 和 Class.forName ("className"之间的区别)

regex - 在 VS Code 中搜索多个术语

c# - 正则表达式替换方括号中除外的字符串

java - GEF编辑在外界的形象如何下降?

java - 使用另一个库将驱动程序路径发送到 selenium 节点

regex - 逗号分隔的重复