我有以下类型的字符串,
abc - xyz
abc - pqr - xyz
abc - - xyz
abc - pqr uvw - xyz
我想检索文本
xyz
从第一个字符串和 pqr
来自第二个字符串,``(空)来自第三个 & pqr uvw
.第二个连字符是可选的。 abc
是静态字符串,它必须在那里。我试过以下正则表达式,/^(?:abc) - (.*)[^ -]?/
但它给了我以下输出,
xyz
pqr - xyz
- xyz
pqr uvw - xyz
我不需要第二个字符串中的最后一部分。我正在使用 perl 编写脚本。可以通过正则表达式完成吗?
最佳答案
请注意 (.*)
part 是一个贪婪的量化点,它尽可能多地抓取除换行符以外的任何 0+ 字符,直到行尾和 [^ -]?
,由于 ?
能够匹配空字符串量词(1 或 0 次重复),匹配行尾的空字符串。因此,pqr - xyz
abc - pqr - xyz
的输出仅适用于正则表达式引擎。
您需要在此处使用更严格的模式。例如。
/^abc\h*-\h*((?:[^\s-]+(?:\h+[^\s-]+)*)?)/
见 regex demo .
详情
^
- 字符串开头 abc
- 一个 abc
\h*-\h*
- 用 0+ 个水平空格括起来的连字符 ((?:[^\s-]+(?:\h+[^\s-]+)*)?)
- 第 1 组捕获可选出现的[^\s-]+
- 除了空格和 -
之外的 1 个或多个字符(?:\h+[^\s-]+)*
- 零次或多次重复\h+
- 1+ 个水平空白 [^\s-]+
- 除了空格和 -
之外的 1 个或多个字符关于regex - 在可选的连字符正则表达式之间捕获单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48768612/