匹配以;
结尾的字符串使其成为可选字符串,并且不捕获该组,因为它不是必需的。但是要捕获第一个条件之后发生的其余字符串。
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。有人帮我解决这个问题吗?
答案 0 :(得分:0)
在我看来,你的正则表达式应该可行,但它可能会有所改进。
匹配是否始终从字符串的开头开始? (这是一个棘手的问题;如果你不能做出这个假设,这个问题根本没有意义。)
是否会有多个分号?如果是这样,您是否希望非捕获部分仅扩展到第一个或最后一个?
它应该始终在字符串的末尾结束,还是只想匹配期间?可以有多个时期吗?
这个极少变化的正则表达式似乎可以满足您的需求,增加的锚点可能会提高性能,足以满足您的需求:
^(?:.*?;\s*)?(.+)\..*$
这个应该快得多;将.*
替换为否定字符类([^;]*
和[^.]+
)几乎完全消除了回溯:
^(?:[^;]*;\s*)?([^.]+)
如果您正在使用支持它们的正则表达式,原子组和占有量词可以使它更快:
^(?>[^;]*+;\s*+)?+([^.]++)