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])*
和ba
的任何字符中的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";
^^^^^^^^^^^^^