字符串replaceAll中的Java正则表达式:否定的前瞻无法按预期工作

时间:2018-08-23 10:53:47

标签: java regex string string-matching

我正在尝试处理文本并替换所有以“ www”开头的情况。带有特定词(在这种情况下为“香蕉”),但是我想排除所有在“ www”之前带有“ http://”的情况。

当我使用正向前瞻时,它可以工作(只有http://www大小写发生变化),但是当我使用负向前瞻时,两个单词都将改变。

您能帮我吗?

String baseString = "replace this: www.q.com and not this:http://www.q.com";
String positiveLookahead = baseString.replaceAll("(?:http://)www([^ \n\t]*)", "Banana");
String negativeLookahead = baseString.replaceAll("(?!http://)www([^ \n\t]*)", "Banana");

//positiveLookahead works (changes only the scond phrase), but positiveLookahead does not (changes both)

1 个答案:

答案 0 :(得分:2)

使用否定的lookbehind(?<!http://)

String negativeLookahead = baseString.replaceAll("(?<!http://)www[^ \n\t]*", "Banana");

(?<!http://)www[^ \n\t]*模式匹配:

  • (?<!http://)-字符串中没有紧跟http://的位置
  • www-文字www子字符串
  • [^ \n\t]*-除空格,换行符和回车符外的任何0+个字符(可能您想尝试使用\\S*)。