正则表达式,用于组合多个序列

时间:2019-05-13 14:26:14

标签: java regex regex-negation regex-lookarounds

与许多人一样,我正在努力解决似乎是“琐碎”的正则表达式问题。 在给定的文本中,每当我在{}括号内遇到一个单词时,都需要将其提取。起初,我使用

"\\{-?(\\w{3,})\\}"

效果很好:

只要单词没有空格或特殊字符(如')。 例如,{Project}返回Project。但是{Project Test}或{Project D'arce}不返回任何内容。 我知道对于白色字符,我需要使用\ s。但是对于我来说,如何添加上述内容绝对不清楚,我尝试过:

"%\\{-?(\\w(\\s{3,})\\)\\}"))

但不起作用。如果我要添加包含特殊字符(如'???)的单词怎么办?真令人沮丧

2 个答案:

答案 0 :(得分:3)

如何匹配{..}中不是}的任何字符?

为此,您可以像[^..]一样使用negated character class [^}]。这样您的正则表达式可以看起来像

"\\{[^}]{3,}\\}"

但是,如果您只想将正则表达式限制为某些特定的字母,则还可以使用字符类来组合许多字符,甚至可以组合预定义的shorthand character classes,例如\w \s \d等等。

因此,如果您想接受任何单词字符\w或空格\s',则您的正则表达式可能类似于

"\\{[\\w\\s']{3,}\\}"

答案 1 :(得分:2)

您可以使用character class [\w\s']并在其中添加您可以匹配的内容:

\{-?([\w\s']{3,})}

在Java中

String regex = "\\{-?([\\w\\s']{3,})}";

Regex demo

如果您只想防止匹配3个空格字符,则可以使用重复组:

\{-?\h*([\w']{3,}(?:\h+[\w']+)*)\h*}

关于图案

  • \{匹配{字符
  • -?可选的连字符
  • \h*匹配0+次水平空白字符
  • ([\w\s']{3,})匹配3个或更多匹配单词char,空白char或'
  • 的组
  • (?:\h[\w']+)*重复0+次,匹配1+个水平空格字符,然后是字符类中列出的字符
  • \h*匹配0+次水平空白字符
  • }匹配}

在Java中

String regex = "\\{-?\\h*([\\w']{3,}(?:\\h+[\\w']+)*)\\h*}";

Regex demo