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

RegEx for combining multiple sequences

和很多人一样,我正在努力解决 "trivial" 正则表达式问题。 在给定的文本中,每当我遇到 {} 括号内的单词时,我需要首先提取 it.At 我使用

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

它工作正常:

只要单词中没有任何白色 space 或像 ' 这样的特殊字符。 例如 {Project} returns Project.But {Project Test} 或 {Project D'arce} 不要 return 任何东西。 我知道对于白色字符我需要使用 \s.But 我完全不清楚如何添加到上面,我试过:

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

但不是 working.Also 如果我想添加包含特殊字符(如 ' ???真令人沮丧

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

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

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

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

所以如果你想接受任何单词字符 \w 或空格 \s' 你的正则表达式可以看起来像

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

您可以使用 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、whitespace char 或 '
  • (?:\h[\w']+)* 重复 0+ 次匹配 1+ 个水平空白字符,后跟字符中列出的内容 class
  • \h* 匹配 0+ 次水平空白字符
  • } 匹配 }

在Java

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

Regex demo