手工制作的成分列表可能类似于:
180-200g/6-7oz flour
3-5g sugar
6g to 7g sugar
2 1/2 tbsp flour
3/4 cup flour
项目必须按如下方式标准化:
180 to 200 g / 6 to 7 oz flour
3 to 5 g sugar
6 g to 7 g sugar
2 1/2 tbsp flour
3/4 cup flour
这是我到目前为止所做的:
text = text.replaceAll( "([0-9])-([0-9])", "$1 to $2" );
text = text.replaceAll( "([^0-9])/([0-9])", "$1 / $2" );
return text.replaceAll( "([0-9])([^0-9 /])", "$1 $2" );
分割数据的最有效正则表达式是什么?
谢谢!
答案 0 :(得分:2)
您可以使用\b
在字边界处插入空格:
return text.replaceAll( "([0-9])-([0-9])", "$1 to $2" )
.replaceAll( "\\b", " ")
.replaceAll( " {2,}", " ")
.trim();
答案 1 :(得分:2)
这是一个只使用环绕声来插入空格的单行:
text = text.replaceAll("(?=-)|(?<=-)|(?<=[^\\d ])(?=/)|(?<=\\d/?)(?=[^\\d /])|(?<=\\D/)(?=\\d)", " ");
这适用于所有情况。这是一些测试代码:
public static void main(String[] args) {
String[] inputs = { "180-200g/6-7oz flour", "3-5g sugar", "6g to 7g sugar", "2 1/2 tbsp flour", "3/4 cup flour" };
String[] outputs = { "180 - 200 g / 6 - 7 oz flour", "3 - 5 g sugar", "6 g to 7 g sugar", "2 1/2 tbsp flour", "3/4 cup flour" };
int i = 0;
for (String input : inputs) {
String output = input.replaceAll("(?=-)|(?<=-)|(?<=[^\\d ])(?=/)|(?<=\\d/?)(?=[^\\d /])|(?<=\\D/)(?=\\d)", " ");
if (!output.equals(outputs[i++])) {
System.out.println("Failed with input: " + input);
System.out.println("Expected: " + outputs[i - 1]);
System.out.println(" Actual: " + output);
}
}
}
按预期,输出无效。
如果测试失败,这将帮助您了解它出错的地方。
答案 2 :(得分:1)
你可以合并
text = text.replaceAll( "([^0-9])/([0-9])", "$1 / $2" );
return text.replaceAll( "([0-9])([^0-9 /])", "$1 $2" );
使用类似的东西:
text.replaceAll("\\D(?=/\\d)|(?<=\\D)/(?=\\d)|\\d(?=[^0-9 /])", "$0 ");
如果那会更快或者我不知道。
如果使用这种方法很多,你可能会通过预编译所有模式获得更多,并在此使用编译模式。