【问题标题】:Regex for multiple words between special characters特殊字符之间多个单词的正则表达式
【发布时间】:2017-11-20 18:11:29
【问题描述】:

我正在尝试使用 Java 中的正则表达式在某些特殊字符之间至少包含一个单词的每组单词。这些是一些示例字符串来澄清它:

{ ? <> <> ; <> ? ; <> ? . ? <> ? . ? <> ? . ? <> ? }
{ <> <> ? . <> <> ? }
{ <> <> <> }
{ OPTIONAL { <> <> ? } FILTER ( ! bound(?) ) }
{ FILTER not exists ( ! bound(?) ) }
{ <> <> ? . ? <> ? }
{ ? <> <> ; a <> }
{ <> <> ?@en }
{ <> <> <> }
{ <> <> ? . <> <> ? FILTER ( ? > ? ) }
{ <> <> ? . ? <> ? FILTER regex(? ?) }
{ <> <> ? FILTER ( ! bound(?) ) }
{ ? <> ? ; <> ? . ? <> ? }
{ ? <> ? ; <> ? . ?2 <> ? ; <> ? }
{ ? <> <> ; <> ? . ? <> ? }
{ <> <> ? . <> <> ? FILTER ( ? = ? ) }

我的比赛应该是这样的:

OPTIONAL
FILTER
bound
FILTER not exists
bound
...

这是我目前想出的正则表达式:

[^\d\W\\a\@]+

你可以在这里测试它:https://regex101.com/r/cP3Uri/2

我的问题是我的正则表达式只会找到完整的单词而没有单词组(中间有空格)。这意味着这个子字符串 FILTER not exists 将获得 3 个匹配项(每个单词一个),但我希望它只是一个匹配项。

谁能帮我找到正确的正则表达式?

【问题讨论】:

标签: java regex


【解决方案1】:

您可以使用[a-zA-Z]{2}[a-zA-Z ]*\\b 查找最少两个字符的单词

  • [a-zA-Z]{2} : 完全匹配 2 个大写或小写字母
  • [a-zA-Z ]*\\b:匹配零个或多个大小写字符,单词边界

要仅查找后跟仅带有空格的单词的单词,请使用

[a-zA-Z]{2}(?:\\s*[a-zA-Z]{2,})*

【讨论】:

    【解决方案2】:
    \w+(?:\s*\w+)*
    

    用于捕获所有组,包括 'a' 和 2 个字符

    \w{2}(?:\s*\w+)*
    

    仅用于捕获具有多个字符的组

    您可以将 \w 替换为 [a-zA-Z] 以排除数字。

    https://regex101.com/r/cP3Uri/7

    【讨论】:

    • \s+ 会不会更合适? \s 永远不会匹配零次。
    • 你说得对,我认为\w{2,}(?:\s+\w+)* 会更合适。这就是说:匹配具有多个字符的任何单词以及之后的所有单词以空格分隔。 \w{2}(?:\s*\w+)* 表示匹配前两个字符,然后匹配后面的所有字符,即使它们用空格分隔。
    【解决方案3】:

    您可以使用其中一种,尊重您的原始模式:

    [^\d\W\\a\@]([^\d\W\\a\@]| )*\b
    [^\d\W\\a\@]+( +[^\d\W\\a\@]+)*
    

    查看演示:12

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-06
      • 1970-01-01
      相关资源
      最近更新 更多