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

Java 继续扫描字符串,直到找到字符串的第一个/最后一个匹配项,java,regex,string,computer-science,Java,Regex,String,Computer Science,我想用正则表达式扫描这行文本 axhaweacb 我想把文字从“a”改为“b”。这是我目前的模式: pattern = "a.*?b"; 当前的输出是:axhawacb(它接收a和b之间的所有内容),但我想要接收的是“acb” 你为什么会问?我尝试应用的逻辑/正则表达式是: 当您找到第一个出现的“from”正则表达式(“a”)时,开始扫描。如果您找到“from”字母的另一个匹配项,但没有找到字母的“最后一个”匹配项(在本例中为“b”),请删除上一个字符串(即axh),使该字符串变为:awea

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

axhaweacb
我想把文字从“a”改为“b”。这是我目前的模式:

pattern = "a.*?b";
当前的输出是:
axhawacb
(它接收a和b之间的所有内容),但我想要接收的是“acb”

你为什么会问?我尝试应用的逻辑/正则表达式是: 当您找到第一个出现的“from”正则表达式(“a”)时,开始扫描。如果您找到“from”字母的另一个匹配项,但没有找到字母的“最后一个”匹配项(在本例中为“b”),请删除上一个字符串(即
axh
),使该字符串变为:
aweacb
。如果您找到另一个“from”-在本例中为
a
,而没有找到“to”-
b
。删除上一个字符串,使其成为
acb
。然后再次开始扫描。在这种情况下,我们找到了我们的模式——a到b,没有另一个“a”

我知道我可以从字符串的子字符串开始,并将所有内容剥离,直到最后出现“a”-但我也希望将其用于不同的字符串。在这种情况下,它将始终替换所有内容,直到最后一次出现某些内容-这将导致删除大量数据

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


谢谢。

您可以使用这个基于负前瞻的正则表达式:

a(?:(?![ab]).)*b
  • (?![ab])
    是匹配除
    a和b之外的任何内容的负正则表达式`
  • (?:(?![ab])*
    匹配非
    a
    和b
    的任何字符中的0个或多个,从而使我们能够在
    a
    b之间进行最短的匹配`

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

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

所以,您需要的是一种排除(=如果找到则失败)它们之间所有前导和尾随子模式的方法

可借助以下工具完成:


这是一个

你知道你的字符串总是3个字符长吗?在这种情况下,您似乎可以使用模式
“a.b”
。我不知道它是否可以推广到其他字符串,但您可以考虑一下。谢谢。它起作用了。但是,如果我想对不同的字符串重用这个正则表达式,而不必每次都更改正则表达式,我该怎么做呢。例如,尝试将“my name is jack”与以下正则表达式匹配:name(?:(?![namejack]))*jack。这将返回“name is jack”。但是当我尝试:my(?(?![myjack])*jack匹配整个字符串时,它不会返回任何结果。知道为什么吗?在
[…]
中不能使用多字符串。您可以使用:FYI,如果您的输入中有换行符,您还需要指定DOTALL修饰符,以便
可以匹配换行符。
pattern = "a(?:(?!a|b).)*b";
            ^^^^^^^^^^^^^