继续扫描字符串,直到找到字符串的第一个/最后一个字符串

时间:2016-03-21 09:49:26

标签: java regex string computer-science

我想要使用正则表达式扫描这行文本。

axhaweacb

我希望将文字从“a”变为“b”。这是我目前的模式:

pattern = "a.*?b";

当前的输出是:axhaweacb(它在a和b之间取得了所有内容),但我想要收到的是“acb”。

为什么你会问?我试图应用的逻辑/正则表达式是: 当您发现第一次出现“从”正则表达式(“a”)时,开始扫描。如果您发现另一个“from”字母而未找到字母的“last”出现 - 在本例中为“b”,则删除前一个字符串 - 即axh,以便字符串变为:{{1 }}。如果您发现另一个“来自” - 在本例中为aweacb,则未找到“to” - a。删除前一个字符串,使其变为b。然后再次开始扫描。在这种情况下,我们找到了我们的模式 - a到b,在我们的路上没有另一个“a”。

我知道我可以将字符串子串起来,并删除所有内容,直到最后一次出现“a” - 但我也希望将其重用于不同的字符串。在这种情况下,它总是会对所有内容进行子串,直到最后一次出现 - 这会导致删除大量数据。

我希望我明白我的问题/问题。如果没有,请告诉我,我会尽力澄清我的问题。

谢谢。

2 个答案:

答案 0 :(得分:1)

正则表达式引擎从左到右搜索匹配项。当它找到a a.*?b时,它就是您字符串中的第一个a。然后,找到并匹配的第一个baxhaweacb字符串中的最后一个字符。

延迟量词匹配最接近后续子模式的最右侧字符,而不是最短的子字符串。

因此,您需要的是排除(=失败,如果找到)所有出现的前导尾随子模式的方法。

可以在tempered greedy token

的帮助下完成
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`
  • 的字符中的0个或更多个字符

RegEx Demo