用正则表达式替换java不会从左到右替换

时间:2013-09-19 17:42:40

标签: regex markdown replaceall

我正在尝试做降价解析器。基本上,现在我只想将“这是一个*斜体*文本”转换为“这是一个< em> italic< / em>文本”。

基本上我有这个:

html_text = html_text.replaceAll(“\ *(。+)\ *”,“< em> $ 1< / em>”);

这是问题所在。如果我在一个字符串中使用replaceAll,例如“this * is * a * test * ok”。它不会取代它2次,只会更换一次。无论如何,它可以使用replaceFirst()多次修复,所以它没什么大不了的,我仍然不知道为什么它是replaceAll()并且它不会替换所有...

无论如何,使用replaceFirst()我得到一个替换,结果如下:“this< em>是* a * test< / em> ok。”我不太了解正则表达式,但我希望它从左到右替换不使用任意规则。也就是说,它应该找到的第一个块是“* is *”而不是“* is * a * test *”,结果是“this< em> is< / em> a * test * ok。”。无论如何,另一次输出是:“这< em>是< em>< / em>测试< / em>确定。”这是错的。从左到右将给出正确的一个:“此< em>是< / em>< em>测试< / em>确定。”

由于我对正则表达不太了解而且我一直在寻找一段时间我决定只问你们。

TL.DR。:我希望使用从左到右的顺序替换replaceFirst(),而不是任意一个。

编辑:解决方案是不允许搜索内的*符号。 replaceAll()工作正常。仍然允许从左到右的搜索将更容易解决问题,所以它可能吗?

1 个答案:

答案 0 :(得分:0)

试试这个:

\*([^*]+)\*(取一个或多个除星号外的任何东西)

或者这个:

\*(.+?)\*(非贪婪的+版本,所以最小的匹配到星号)

你的(.+)贪婪,所以它会转到最后一个星号并捕获超出你想要的数量。非贪婪的正则表达式在我的脑海中是更优雅的,但任何一个都有效。