我想要使用正则表达式扫描这行文本。
axhaweacb
我希望将文字从“a”变为“b”。这是我目前的模式:
pattern = "a.*?b";
当前的输出是:axhaweacb
(它在a和b之间取得了所有内容),但我想要收到的是“acb”。
为什么你会问?我试图应用的逻辑/正则表达式是:
当您发现第一次出现“从”正则表达式(“a”)时,开始扫描。如果您发现另一个“from”字母而未找到字母的“last”出现 - 在本例中为“b”,则删除前一个字符串 - 即axh
,以便字符串变为:{{1 }}。如果您发现另一个“来自” - 在本例中为aweacb
,则未找到“to” - a
。删除前一个字符串,使其变为b
。然后再次开始扫描。在这种情况下,我们找到了我们的模式 - a到b,在我们的路上没有另一个“a”。
我知道我可以将字符串子串起来,并删除所有内容,直到最后一次出现“a” - 但我也希望将其重用于不同的字符串。在这种情况下,它总是会对所有内容进行子串,直到最后一次出现 - 这会导致删除大量数据。
我希望我明白我的问题/问题。如果没有,请告诉我,我会尽力澄清我的问题。
谢谢。
答案 0 :(得分:1)
正则表达式引擎从左到右搜索匹配项。当它找到a
a.*?b
时,它就是您字符串中的第一个a
。然后,找到并匹配的第一个b
是axhaweacb
字符串中的最后一个字符。
延迟量词匹配最接近后续子模式的最右侧字符,而不是最短的子字符串。
因此,您需要的是排除(=失败,如果找到)所有出现的前导和尾随子模式的方法。
的帮助下完成pattern = "a(?:(?!a|b).)*b";
^^^^^^^^^^^^^
这是demo
答案 1 :(得分:0)
你可以使用这种基于正则表达式的负前瞻:
a(?:(?![ab]).)*b
(?![ab])
是除了a
和b` (?:(?![ab]).)*
匹配任何不是a
和b , thus giving us shortest match between
a and
b`