匹配字符串直到符号并使其可选。不要捕获匹配的可选字符串

时间:2013-06-11 06:39:25

标签: regex optional-parameters regex-greedy regex-lookarounds

匹配以;结尾的字符串使其成为可选字符串,并且不捕获该组,因为它不是必需的。但是要捕获第一个条件之后发生的其余字符串。

Text1:transfer from source not possible; snapmirror may be misconfigured, the source volume may be busy or unavailable.

Text2:snapmirror may be modified, the destination volume is unavailable.

所需的输出:

snapmirror may be misconfigured, the source volume may be busy or unavailable

snapmirror may be modified, the destination volume is unavailable

我希望我的正则表达式能够在分号前找到'从源传输不可能'或以这种方式发生的任何字符串,并且我希望我的正则表达式不要将其作为一个组捕获。

另外,我想捕获分号后直到结束的所有内容。

正则表达式尝试过:(?:.*;)? (.+)\..*

上述正则表达式适用于Text1但不适用于Text2。有人帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

在我看来,你的正则表达式应该可行,但它可能会有所改进。

  • 匹配是否始终从字符串的开头开始? (这是一个棘手的问题;如果你不能做出这个假设,这个问题根本没有意义。)

  • 是否会有多个分号?如果是这样,您是否希望非捕获部分仅扩展到第一个或最后一个?

  • 它应该始终在字符串的末尾结束,还是只想匹配期间?可以有多个时期吗?

这个极少变化的正则表达式似乎可以满足您的需求,增加的锚点可能会提高性能,足以满足您的需求:

^(?:.*?;\s*)?(.+)\..*$

这个应该快得多;将.*替换为否定字符类([^;]*[^.]+)几乎完全消除了回溯:

^(?:[^;]*;\s*)?([^.]+)

如果您正在使用支持它们的正则表达式,原子组和占有量词可以使它更快:

^(?>[^;]*+;\s*+)?+([^.]++)