用正则表达式匹配连字符之间的文本

Posted

技术标签:

【中文标题】用正则表达式匹配连字符之间的文本【英文标题】:Matching text between hyphens with regex 【发布时间】:2012-10-28 19:03:47 【问题描述】:

目前我有这个字符串

"RED-CURRENT_FORD-something.something"

我需要捕捉连字符之间的单词。在这种情况下,单词CURRENT_FORD

我写了以下内容

\CURRENT_.*\B-\

返回CURRENT_FORD-,这在两个层面上是错误的。

    这意味着连字符之间的所有内容都以CURRENT开头 它在末尾包含连字符。

有没有更有效的方法来捕获连字符之间的单词而不明确说明第一个单词?

【问题讨论】:

一个基于regex 的问题应该标记为language 你正在使用... 【参考方案1】:

您可以使用分隔符来帮助绑定您的模式,然后捕获您想要的内容。

/-([^-]+)-/

然后您可以剪掉连字符。

【讨论】:

如果是 js 正则表达式,你不能使用前瞻/后视吗? 我倾向于避免看起来。使用捕获时似乎没有必要。【参考方案2】:

你可以使用这些正则表达式

(?<=-).*?(?=-)//if lookaround is supported

-(.*?)-//captured in group1

.*? 匹配任何字符,即. 0 到多次,即* 懒惰,即?

(?&lt;=-) 是零宽度后视断言,它将在所需匹配之前匹配字符 -,即 .*?(?=-) 是零宽度前瞻断言,匹配后匹配 - 字符.*?

【讨论】:

【参考方案3】:
(?<=-)\w+(?=-)

本身不参与捕获的连字符之间的任何序列或“单词”字符(后视和前瞻条件)

【讨论】:

【参考方案4】:

尝试使用单词边界选项:

/^.*-\b(\w+)\b-.*$/

这实际上是 3(嗯,2)部分:

^.*-\b

表示从标记开始到破折号后跟单词边界(“单词字符”和非“单词字符”之间的不可见边界)的所有字符

(\w+)

捕获破折号之间的位并将其放入匹配的模式变量中(这就是括号的用途)

最后一部分只是第一部分的重复,以匹配破折号后的任何其他字符。

【讨论】:

以上是关于用正则表达式匹配连字符之间的文本的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中的正则表达式

字符之间的Python正则表达式匹配

8-1 正则表达式概览 RE

正则表达式如何匹配空值?

正则表达式如何匹配空值?

iOS之正则表达式