我正在尝试提出一个正则表达式,它只能匹配字符串中没有特殊转义序列的字符。
例如,在字符串Is ? stranded//?
中,我希望能够替换未使用其他字符串转义的?
,因此我可以获得此结果:**Is Dave stranded?**
但是对于我的生活,我一直无法找到方法。我只提出了吃掉所有可替换字符的正则表达式。
如何构造一个只匹配前面没有转义序列的字符的正则表达式?
答案 0 :(得分:5)
使用负面的外观,这是他们的目的!
(小于?!//)[?\]
要把它踩下来:
(
?<! #The negative look behind. It will check that the following slashes do not exist.
// #The slashes you are trying to avoid.
)
[\?] #Your special charactor list.
只有在找不到//时,它才能继续进行搜索。
我认为在Java中它需要再次转义为字符串,如:
Pattern p = Pattern.compile("(?<!//)[\\?]");
答案 1 :(得分:3)
试试这个Java代码:
str="Is ? stranded//?";
Pattern p = Pattern.compile("(?<!//)([?])");
m = p.matcher(str);
StringBuffer sb = new StringBuffer();
while (m.find()) {
m.appendReplacement(sb, m.group(1).replace("?", "Dave"));
}
m.appendTail(sb);
String s = sb.toString().replace("//", "");
System.out.println("Output: " + s);
Output: Is Dave stranded?
答案 2 :(得分:2)
我正在考虑这个并且有第二个更简单的解决方案,避免使用正则表达式。其他答案可能更好,但我想我可能会发布它。
String input = "Is ? stranded//?";
String output = input
.replace("//?", "a717efbc-84a9-46bf-b1be-8a9fb714fce8")
.replace("?", "Dave")
.replace("a717efbc-84a9-46bf-b1be-8a9fb714fce8", "?");
保护“//?”用一些独特的东西(如guid)替换它。然后你知道任何剩下的问号都是合理的游戏。
答案 3 :(得分:1)
使用分组。这是一个例子:
import java.util.regex.*;
class Test {
public static void main(String[] args) {
Pattern p = Pattern.compile("([^/][^/])(\\?)");
String s = "Is ? stranded//?";
Matcher m = p.matcher(s);
if (m.matches)
s = m.replaceAll("$1XXX").replace("//", "");
System.out.println(s + " -> " + s);
}
}
输出:
$ java Test
Is ? stranded//? -> Is XXX stranded?
在这个例子中,我是:
编辑使用if (m.matches)
确保您正确处理不匹配的字符串。
这只是一个快速而肮脏的例子。显然,你需要充实它,使其更加强大。但它得到了一般性的想法。
答案 4 :(得分:0)
匹配除转义序列之外的一组字符,然后是正则表达式特殊字符。您可以使用倒置字符类([^/]
)作为第一位。特殊情况下,字符串前面有一个未转义的正则表达式字符。
答案 5 :(得分:0)
尝试匹配:
(^|(^.)|(.[^/])|([^/].))[special characters list]
答案 6 :(得分:0)
String aString = "Is ? stranded//?";
String regex = "(?<!//)[^a-z^A-Z^\\s^/]";
System.out.println(aString.replaceAll(regex, "Dave"));
正则表达式[^a-z^A-Z^\\s^/]
的部分匹配非字母数字,空格或非正斜杠字符。
(?<!//)
部分会产生负面反馈 - 请参阅docco here了解更多信息
这给出了输出Is Dave stranded//?
答案 7 :(得分:0)