java - 继续扫描字符串,直到找到字符串的第一次/最后一次出现

标签 java regex string computer-science

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

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.*?ba 时,它就是字符串中的第一个 a。然后,找到并匹配的第一个 baxhaweacb 字符串中的最后一个字符。

惰性量词匹配与后续子模式最接近的最右边字符,而不是最短的可能子字符串。

因此,您需要一种方法来排除(=如果找到则失败)所有出现在它们之间的前导尾随子模式。

这可以在 tempered greedy token 的帮助下完成:

pattern = "a(?:(?!a|b).)*b";
            ^^^^^^^^^^^^^

这是一个demo

关于java - 继续扫描字符串,直到找到字符串的第一次/最后一次出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36127655/

相关文章:

java - 尝试创建新的 JarFile 时出现 "java.util.zip.ZipException: error in opening zip file"

java - mongodb Java Driver构建错误: cannot access com. mongodb.client.result.InsertOneResult,找不到类文件

javascript - 在 JavaScript 中使用正则表达式检查允许的字符

javascript - 使用 'undefined' 函数参数返回简单类型错误

string - 在 MATLAB 中将字母转换为 NATO 字母表

c - 返回字符串文字?

Java 更改和移动非标准的 XML 文件

java - Log4j2 - 不支持的参数

regex - 其他记录之间的字符串列表加载错误Hive

python - 过滤掉仅包含数字和/或标点符号的字符串 - python