我想使用正则表达式扫描这行文本。
axhaweacb
我想获取从“a”到“b”的文本。这是我当前的模式:
pattern = "a.*?b";
当前输出是:axhaweacb
(它获取 a 和 b 之间的所有内容),但我想收到的是“acb”。
你可能会问为什么?我尝试应用的逻辑/正则表达式是:
当您找到第一次出现“from”正则表达式(“a”)时,开始扫描。如果您找到“from”字母的另一次出现,而没有找到字母的“最后”一次出现(在本例中为“b”),请删除前一个字符串 - 即 axh
,以便该字符串变为: aweacb
。如果您找到另一个“from” - 在本例中是a
,而没有找到“to” - b
。删除之前的字符串,使其成为 acb
。然后再次开始扫描。在这种情况下,我们已经找到了我们的模式 - a 到 b,没有另一个“a”阻碍我们。
我知道我可以从字符串开始进行子串,并删除所有内容,直到最后一次出现“a” - 但我也想将其重用于不同的字符串。在这种情况下,它总是会对所有内容进行子字符串化,直到最后一次出现某些内容 - 这会导致删除大量数据。
我希望我清楚地表达了我的问题。如果没有,请告诉我,我会尽力澄清我的问题。
谢谢。
最佳答案
正则表达式引擎从左到右搜索匹配项。当它找到带有 a.*?b
的 a
时,它就是字符串中的第一个 a
。然后,找到并匹配的第一个 b
是 axhaweacb
字符串中的最后一个字符。
惰性量词匹配与后续子模式最接近的最右边字符,而不是最短的可能子字符串。
因此,您需要一种方法来排除(=如果找到则失败)所有出现在它们之间的前导和尾随子模式。
这可以在 tempered greedy token 的帮助下完成:
pattern = "a(?:(?!a|b).)*b";
^^^^^^^^^^^^^
这是一个demo
关于java - 继续扫描字符串,直到找到字符串的第一次/最后一次出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36127655/