我想使用Java正则表达式替换单个<,但不是< <(所以我正在使用String.replaceAll())。现在我有Java正则表达式超匹配
([^<]|^)<([^<]|$)
它在Python中工作,但不是Java。我也试图否定环视,喜欢的东西
(?<!<)<(?!<)
不过,我目前所有的尝试匹配< <为好。难道我做错了什么?有没有我不知道的Java特有的东西?
我想使用Java正则表达式替换单个<,但不是< <(所以我正在使用String.replaceAll())。现在我有Java正则表达式超匹配
([^<]|^)<([^<]|$)
它在Python中工作,但不是Java。我也试图否定环视,喜欢的东西
(?<!<)<(?!<)
不过,我目前所有的尝试匹配< <为好。难道我做错了什么?有没有我不知道的Java特有的东西?
如果你想用 “X” 来代替单一的 “<” 说,这样做:
String test = "hello << world < blah < blah << blah";
String _test = test.replaceAll("(^|[^<])<([^<]|$)", "$1X$2");
System.out.println(_test);
给你这样的:
hello << world X blah X blah << blah
编辑更新以匹配在开始和行末
“(\ A | [^ <])<([^ <] | \ Z)”来获得字符串开始和结尾的出现次数。 – Svante 2009-12-16 11:38:06
这可以用于'a 2009-12-16 11:38:45
嗨斯万特 - 是的,我只是调整照顾的开始,行结束 – 2009-12-16 11:39:37
也许您正在使用错误的替换?
\ n仅用于向模式端捕获组反向。您必须使用$ n才能在替换端使用它。
你的第一个正则表达式包含字符类([^<]|^)
。这是一个积极的匹配,所以无论在角色类中被捕获什么,都将被替换为replaceAll()
。
你的第二个正则表达式只使用环视,它仅验证条件,并且不匹配:
(?<!<)<(?!<)
那一个正常工作对我来说:它不匹配<<
。也许你可以发布一个代码片段和一些不符合你期望的输入/输出?
是啊,第一次更换真是的replaceAll( “([^ <] | ^)<([^ <] | $)”, “\\ 1(\\ 2”) 但第二个实际上是正常工作你用replaceAll?我有replaceAll(“(?<!<)<(?!<)”,“(”)替换<<((在所有的测试输入中。也许我需要使用匹配器和模式? – tobiasvl 2009-12-16 11:16:35
@tobiasvl:我在Java模式下使用正则表达式模拟器进行了一次测试,结果表明它工作正常。或许replaceAll和Matcher的工作方式不同吗?不妨试试它吧 – Andomar 2009-12-16 11:27:31
我已经在Java中测试过了,而不是模拟器,它按预期工作:替换'<'并单独保留'<<',无论使用'String#replaceAll'还是'Matcher#replaceAll',结果都是一样的 – 2009-12-16 13:19:59
'S = s.replaceAll( “(<<)<(<)?!?!”, “X”);'对我来说工作正常。 – 2009-12-16 13:01:52