【问题标题】:RegEx for combining multiple sequences用于组合多个序列的正则表达式
【发布时间】:2019-09-30 12:53:06
【问题描述】:

与许多人一样,我正在努力解决看似“微不足道”的正则表达式问题。 在给定的文本中,每当我遇到 {} 括号内的单词时,我都需要提取它。起初我使用

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

一切正常:

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

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

但不工作。另外,如果我想添加包含特殊字符的单词,如 ' ???真的很郁闷

【问题讨论】:

  • 您可能想要反转大括号之间的部分,例如类似于\{([^}]{3,})\}。这将匹配一对花括号之间的任何内容。 [^}] 表示“任何 除了 结束花括号。但是请注意,这可能会变得很棘手,我会认真考虑允许这么多,因为这可能会导致很难找到错误,如果要求或数据更改。为什么您首先要允许空格和特殊字符进行匹配?这给人的印象是您要解析代码……是这样吗?
  • 嗨,Thomas,谢谢,它有效。不是真正的代码,而是带有“限制”的文本。但是如果我需要设置一些限制,例如不允许数字,还是某种字符?
  • 好吧,在这种情况下,您要么列出您不想允许的所有内容(例如,[^\d}] 表示额外的“无数字”),或者使用正字符类列出您想要允许的所有内容,例如[\w\s] 表示任何单词字符或空格。您使用什么取决于您的要求,例如是否要使用黑名单(禁止已知字符)或白名单(仅允许已知字符)。
  • 感谢 Thomas、Pshemo 和其他人

标签: java regex regex-negation regex-lookarounds


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 提示:在开始编码之前总是先在这里玩一下:regex101.com
  • @Mick 虽然我喜欢该网站的其他语言,但我不再将它用于 Java 的正则表达式。当我做出这个决定时,有太多的不同(这是几耳前的事,所以也许它得到了改进,我不知道)。此外,我不喜欢让每个/ 都用\/ 逃脱,这在Java 中是不必要的。
【解决方案2】:

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

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

在 Java 中

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

Regex demo

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

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

关于模式

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

在 Java 中

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

Regex demo

【讨论】:

  • 不客气。如果您不想只匹配空白字符,您还可以在 \{-?\s*([\w']{3,}(?: [\w']+)*)\s*} regex101.com/r/vj5Hp4/2 这样的模式中使用重复
猜你喜欢
  • 2020-01-29
  • 1970-01-01
  • 1970-01-01
  • 2020-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-16
  • 2018-07-04
相关资源
最近更新 更多