2009-12-16 113 views
-1

我想使用Java正则表达式替换单个<,但不是< <(所以我正在使用String.replaceAll())。现在我有Java正则表达式超匹配

([^<]|^)<([^<]|$) 

它在Python中工作,但不是Java。我也试图否定环视,喜欢的东西

(?<!<)<(?!<) 

不过,我目前所有的尝试匹配< <为好。难道我做错了什么?有没有我不知道的Java特有的东西?

+0

'S = s.replaceAll( “(<<)<(<)?!?!”, “X”);'对我来说工作正常。 – 2009-12-16 13:01:52

回答

1

如果你想用 “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 

编辑更新以匹配在开始和行末

+0

“(\ A | [^ <])<([^ <] | \ Z)”来获得字符串开始和结尾的出现次数。 – Svante 2009-12-16 11:38:06

+0

这可以用于'a 2009-12-16 11:38:45

+0

嗨斯万特 - 是的,我只是调整照顾的开始,行结束 – 2009-12-16 11:39:37

1

你的第一个正则表达式包含字符类([^<]|^)。这是一个积极的匹配,所以无论在角色类中被捕获什么,都将被替换为replaceAll()

你的第二个正则表达式只使用环视,它仅验证条件,并且不匹配:

(?<!<)<(?!<) 

那一个正常工作对我来说:它不匹配<<。也许你可以发布一个代码片段和一些不符合你期望的输入/输出?

+0

是啊,第一次更换真是的replaceAll( “([^ <] | ^)<([^ <] | $)”, “\\ 1(\\ 2”) 但第二个实际上是正常工作你用replaceAll?我有replaceAll(“(?<!<)<(?!<)”,“(”)替换<<((在所有的测试输入中。也许我需要使用匹配器和模式? – tobiasvl 2009-12-16 11:16:35

+0

@tobiasvl:我在Java模式下使用正则表达式模拟器进行了一次测试,结果表明它工作正常。或许replaceAll和Matcher的工作方式不同吗?不妨试试它吧 – Andomar 2009-12-16 11:27:31

+0

我已经在Java中测试过了,而不是模拟器,它按预期工作:替换'<'并单独保留'<<',无论使用'String#replaceAll'还是'Matcher#replaceAll',结果都是一样的 – 2009-12-16 13:19:59