Dov*_*Dov 4 regex whitespace capture-group
我有一个正则表达式,我试图匹配以下类型的数据,每个标记由未知数量的空格分隔.
更新:"文字"几乎可以是任何字符,这就是我.*最初的原因.重要的是,它还可以包括空格.
我想将"Text","01"和"03"作为单独的组捕获,除"Text"之外的所有组都是可选的.到目前为止我能做的最好的是:
\s*(.*)\s+(\d+)\s*(?:\s*\(?\s*(?:of|-)\s*(\d+)\s*\)?\s*)
Run Code Online (Sandbox Code Playgroud)
这匹配#3-#5,并将它们放在适当的捕获组中.但是,我无法弄清楚,为什么当我?在结尾处添加一个额外的部分以使表达式成为01可选项后,我的捕获组会变得非常时髦.
\s*(.*)\s+(\d+)\s*(?:\s*\(?\s*(?:of|-)\s*(\d+)\s*\)?\s*)?
Run Code Online (Sandbox Code Playgroud)
上面的RegEx匹配#2-#5,但捕获组仅对#2和#5正确.
这似乎是一个简单的正则表达式,所以我不知道为什么我遇到这么多麻烦.
这是一个在线RegEx评估员的链接,我用来帮助我调试这个:http://regexr.com?2tb64 .该链接已经有第一个RegEx和填写的测试数据.
你没有说你正在使用哪个正则表达式工具,所以我假设最小公分母即Javascript.这是一个有效的:
var re = /^\s*(.+?)(?:\s+(\d+)(?:(?:\s+\(?of\s+|-)(\d+)\)?)?)?$/i;
Run Code Online (Sandbox Code Playgroud)
要在Regexr工具中使其工作,请务必打开"多行选项".
在PHP语法中有同样的东西(有很多多汁的评论!):
$re = '/ # Always write non-trivial regex in free-space mode!
^ # Anchor to start of string.
\s* # optional leading whitspace is ok.
(.+?) # Text can be pretty much anything.
(?: # Group to allow applying ? quantifier
\s+ # WS separates "Text" from first number.
(\d+) # First number.
(?: # Group to allow applying ? quantifier
(?: # Second number prefix alternatives
\s+\(?of\s+ # Either " of 03" and " (of 03)",
| - # or just a dash for "-03" case.
) # End second number prefix alternatives
(\d+) # Second number
\)? # Match ")" for " (of 03)" case.
)? # Second number is optional.
)? # First numebr is optional.
$ # Anchor to start of string.
/ix';
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8726 次 |
| 最近记录: |