Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 替换字符串中的子字符串,除非该字符串位于引号内_Java_Regex - Fatal编程技术网

Java 替换字符串中的子字符串,除非该字符串位于引号内

Java 替换字符串中的子字符串,除非该字符串位于引号内,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:

正则表达式方言: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: "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'
因为它“看到”前面有偶数个单引号(iii)。您必须强制它查看其右侧的整个字符串(一直到
$

非常感谢巴特!不知何故,我一直坚持抄袭,从未想过要向前看。
aaa 'substr' bbb 'ccc ddd' eee
           ^     ^       ^
           |     |       |
           i     ii     iii