[英]Find a subtring in a string using a regular expression - JAVA
假设我有一个字符串“ kk abcjkmkc jjkocc abc jjj'abckkkkkkkkkkkkkkkkkk'”
我想替换仅在单引号之外的字符串中的子字符串abc,但不起作用。
这是我的代码
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()
`
要在引号外搜索子字符串,可以执行以下操作:
Pattern pat = Pattern.compile("^(?:[^']|'[^']*')*?a\\.b\\.c");
第一部分将跳过:
不是引号( [^']
)的每个字符,或
用引号( '[^']*'
)括起来的每个非引号字符序列。
一旦跳过了这些内容,则如果看到所需的模式,它将知道它不在引号内。
这将处理一个简单的情况。 如果事情开始变得更加复杂,例如,您想允许\\'
在输入字符串中用引号引起来,就像C或Java在字符串文字中一样,则正则表达式开始变得更加复杂,您可以快速地得出一个结论:您的正则表达式不可读或正则表达式不合适。
编辑:修复了在第二个*
之后放置“不愿意”的限定词,以便找到第一个abc
。
编辑2:如果要替换找到的子字符串,它将变得更加棘手。 上面的模式通过abc
匹配字符串的整个开头,而我无法进行后视工作,因此匹配项仅是abc
部分。 我认为您需要将字符串的开头放入组中,然后在替换字符串中使用$1
复制开头:
Pattern pat = Pattern.compile("^((?:[^']|'[^']*')*?)a\\.b\\.c");
Matcher m = pat.matcher(source);
if (m.find()) {
result = m.replaceFirst("$1replacement");
}
我不确定replaceAll
可以与此一起使用,因此,如果要替换所有它们,则可能需要循环。
使用以下模式: a\\.b\\.c(?=(([^']*'){2})*[^']*$)
演示
我不会理会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 '
低效..但是有效
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.