我的正则表达式正在运行 - 直到它捕获的字符串形式略有改变。它过去常常是这样的形式:
Word1 - Word2 - 01.2.3456.7890 - xx-xx - Word 3 [Word-inbracket]
我有兴趣捕获xx-xx
。
为了捕获这些数据,以下正则表达式起作用:
(.+\s*-\s*.+\s*-\s*.+)\s*-\s*(\w{1,3}\s*-\s*\w{1,3})\s*-\s*.+
从中选择组[2]。
然而,现在,字符串已经改变了形式,因此有时会有另一个破折号,以及xx-xx
之后的1到4个字符之间的另一组字母。 (请记住,这有时只会发生。)
所以,现在我还需要捕获以下形式的信息:
Word1 - Word2 - 01.2.3456.7890 - xx-xx-XxxX - Word 3 [Word-inbracket]
Word1 - Word2 - 01.2.3456.7890 - xXX-XxX-xxxx - Word 3 [Word-inbracket]
等
如何编辑我的正则表达式以捕获此字符串以及之前捕获的字符串?最干净的方法是什么?
答案 0 :(得分:0)
有点hacky,但这会有所作为:
(.+\s*-\s*.+\s*-\s*.+)\s*-\s*((\w{1,3}\s*-\s*\w{1,3})|(\w{1,4}\s*-\s*\w{1,4}))\s*-\s*.+
答案 1 :(得分:0)
我相信应该这样做:
(.+?\s*-\s*.+?\s*-\s*.+?)\s*-\s*(\w{1,3}\s*-\s*\w{1,3})\s*(?:-(\w{1,3}))?\s*-\s*.+
我所做的改变是:
这将为您提供一个包含可选位的额外捕获组。
您可以在行动here(已修改)中看到它。
答案 2 :(得分:0)
根据输入线,可以采用更简化的方法。
以下正则表达式匹配这两种情况,并且也适用于对已修改部分的任何其他修改。
([^-]*-){3}\s*([^\s]+).*
这应该捕获第一组“Word1 - Word2 - 01.2.3456.7890 - ”,然后是第二组“xx-xx-XxxX”。
另请注意,我假设第二个所需的组不包含空格,因为示例字符串没有空格。
说明:
([^-]*-){3} # captures the "word1 - word2 - word3.234.234 -" block
\s*
([^\s]+) # captures the "xx-xx-xxx" block up to the first whitespace char.
.* # matches the rest of the line
答案 3 :(得分:0)
这个更清楚。+ \ s- \ s(。+)\ s- \ s。+ $