Java 替换字符串中的子字符串,除非该字符串位于引号内
正则表达式方言:JavaJava 替换字符串中的子字符串,除非该字符串位于引号内,java,regex,Java,Regex,正则表达式方言:Java 问题是:给定一个字符串,替换其中所有出现的子字符串,除非这些出现在引号内 例1: string: "test substr 'test substr' substr" substring: "substr" replacement: "YYYY" output: "test YYYY 'test substr' YYYY" 例2: string: "test sstr 'test sstr' sstr" substring: "substr" replacement:
问题是:给定一个字符串,替换其中所有出现的子字符串,除非这些出现在引号内 例1:
string: "test substr 'test substr' substr"
substring: "substr"
replacement: "YYYY"
output: "test YYYY 'test substr' YYYY"
例2:
string: "test sstr 'test sstr' sstr"
substring: "substr"
replacement: "YYYY"
output: "test sstr 'test sstr' sstr"
例3:
string: "test 'test substr'"
substring: "substr"
replacement: "YYYY"
output: "test 'test substr'"
这是我迄今为止最好的尝试:
Regex: ((?:[^']*'[^']+')*?[^']*?)substring
Replace: $1replacement
它的问题是,它需要在引号中最后一个字符串之后的引号外有一个子字符串,否则它将无法工作,因此示例3将失败(输出:“test‘test YYYY’”
非常感谢您的帮助。这里有一个方法:
public class Main {
public static void main(String [] args) {
String[] tests = {
"test substr 'test substr' substr",
"test sstr 'test sstr' sstr",
"test 'test substr'"
};
String regex = "substr(?=([^']*'[^']*')*[^']*$)";
for(String t : tests) {
System.out.println(t.replaceAll(regex, "YYYY"));
}
}
}
印刷品:
test YYYY 'test substr' YYYY
test sstr 'test sstr' sstr
test 'test substr'
因为它“看到”前面有偶数个单引号(i和ii)。您必须强制它查看其右侧的整个字符串(一直到
$
) 非常感谢巴特!不知何故,我一直坚持抄袭,从未想过要向前看。
aaa 'substr' bbb 'ccc ddd' eee
^ ^ ^
| | |
i ii iii