【发布时间】:2017-12-20 16:11:06
【问题描述】:
我在使用 Java 中的负前瞻定义正则表达式时遇到问题。
给定以下字符串:
Today [#[#item#] was|the items were#] shipped so [#it is|they are#] gone.
我正在尝试根据某个值将此字符串转换为以下形式之一(是的,这是一种区分单数和复数形式的方法):
Today [#item#] was shipped so it is gone. 或Today the items were shipped so they are gone。
我正在尝试在 Java 中使用正则表达式来匹配此模式并实现此转换:
public String convert(String text, boolean isSingular) {
Pattern spPattern = Pattern.compile("\\[#.*?\\|.*?#\\]");
Matcher matcher = spPattern.matcher(text);
while (matcher.find()) {
int start = matcher.start()+2;
int end = matcher.end()-2;
int indexOfPipe = text.indexOf("|", start);
String replacement = (isSingular) ? text.substring(start, indexOfPipe) : text.substring(indexOfPipe+1, end);
text = matcher.replaceFirst(replacement);
matcher = spPattern.matcher(text);
}
}
对于单数形式:while-loop 第一次迭代后text是Today [#item#] was shipped so [#it is|they are#] gone.,这样就可以了。然而,在第二次迭代中,Matcher 匹配组[#item#] was shipped so [#it is|they are#],而它应该是[#it is|they are#]。我很确定我需要某种负面的前瞻性。
我已经尝试了以下模式,但它似乎没有做任何事情:
(\\[#.*?\\|.*?#\\])(?!\\[#[^\\|]*?#\\])(“尝试匹配 [# 和 #] 之间的所有内容,接受那些标签之间不包含 | 的情况”)
我错过了什么?
【问题讨论】:
-
你知道java.text.MessageFormat已经提供了这个功能吗?
-
@VGR :对于这个特定的示例,它应该可以工作,是的。但是,我正在实施的系统还有一些其他要求,这使得使用 java.text.MessageFormat 有点痛苦。
标签: java regex negative-lookahead