假设我有一个字符串“kk a.b.cjkmkc jjkocc a.b.c.jjj'a.b.ckkkkkkkkkkkkkkk”“
我想替换字符串中仅在单引号之外的子字符串a.b.c,但它不起作用。
这是我的代码 `
String str = " kk a.b.cjkmkc jjkocc a.b.c. jjj 'a.b.ckkkkkkkkkkkkkkkk ' ";
Pattern p = Pattern.compile("a\\.b\\.c");
Matcher m = p.matcher(str);
int x = m.find()
`
答案 0 :(得分:1)
要搜索引号外的子字符串,您可以执行以下操作:
Pattern pat = Pattern.compile("^(?:[^']|'[^']*')*?a\\.b\\.c");
第一部分将跳过:
每个不是引号([^']
)或
用引号('[^']*'
)括起来的每个非引号标记字符序列。
一旦跳过这些,如果它看到你想要的模式,就会知道它不在引号内。
这将处理一个简单的案例。如果事情开始变得更复杂,例如你想允许\'
在输入字符串中引用引号,就像C或Java在字符串文字中所做的那样,正则表达式开始变得更加复杂,你可以快速达到一个点,无论你的正则表达式是不可读的还是正则表达式不是合适的解决方案。
编辑:已修复为"不情愿"第二个*
后的限定符,以便找到第一个a.b.c
。
编辑2:如果您想替换您找到的子字符串,它会变得更加棘手。上面的模式通过a.b.c
匹配字符串的整个开头,我无法获得后视工作,因此匹配将仅 {{1部分。我认为您需要将字符串的开头放在一个组中,然后在替换字符串中使用a.b.c
来复制开头:
$1
我不确定Pattern pat = Pattern.compile("^((?:[^']|'[^']*')*?)a\\.b\\.c");
Matcher m = pat.matcher(source);
if (m.find()) {
result = m.replaceFirst("$1replacement");
}
是否可以使用此功能,因此如果您想要替换所有这些,您可能需要循环播放。
答案 1 :(得分:1)
使用此模式:a\.b\.c(?=(([^']*'){2})*[^']*$)
Demo
答案 2 :(得分:0)
我不会乱用REGEX。
public static void main(String[] args) {
String str = " kk a.b.cjkmkc jjkocc a.b.c. jjj 'a.b.ckkkkkkkkkkkkkkkk ' ";
String[] s = str.split("'");
str = s[0].replaceAll("[abc]", "") + "'"+ s[1]+"'"
+ s[2].replaceAll("[abc]", "");
System.out.println(str);
}
OP:
kk ..jkmk jjko ... jjj 'a.b.ckkkkkkkkkkkkkkkk '
效率不高..但有效