0

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

我基本上有这个:

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

这就是问题所在。如果我使用replaceAll,在诸如“this *is* a *test* ok”之类的字符串中。它不会替换它 2 次,只有一次。无论如何,可以多次使用 replaceFirst() 修复它,所以这没什么大不了的,但我仍然不明白为什么它是 replaceAll() 并且它不能全部替换......

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

由于我对正则表达式了解不多,而且我一直在寻找一段时间,所以我决定问问你们。

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

编辑:解决方案不允许在搜索中使用 * 符号。replaceAll() 工作正常。仍然允许从左到右搜索会更容易解决问题,那么有可能吗?

4

1 回答 1

0

尝试这个:

\*([^*]+)\*(除星号外,取 1 个或多个)

或这个:

\*(.+?)\*(+ 的非贪婪版本,因此它需要最小的匹配到星号)

(.+)是贪婪的,所以它会到最后一个星号并捕获比你想要的更多。在我看来,非贪婪的正则表达式是更优雅的一个,但任何一个都有效。

于 2013-09-19T18:23:01.893 回答