我目前正在开发一个项目,我正在为算术表达式创建一个解析器。我想添加一些“高端”功能,但是有一个问题与正则表达式有关。我对正则表达式相对较新,所以我并不是100%肯定它是下面这个案例的正确工具。
目的是让我们的用户为计算字段创建一个方程字符串(由GUI界面辅助,因此他们不必格式化字符串raw),然后将其作为新字段对照我们的数据表示模型我们在数据库中以CSV格式存储信息。但是,我希望用户能够将他们的数据模型中的命名字段绘制到他们的计算中。
例如,采用以下示例模型。
假设我们想要为它添加一个新字段,温度为华氏温度
我有字段4的等式字符串,如下所示。请注意,它是指原始数据中字段2的值作为等式的一部分,括在括号中。
(({Temp_in_degrees} * 9) / 5) + 32
这是一个非常简单的样本方程。更高复杂度的示例可能包括对现有原始数据字段的多个引用。
现在,我想使用正则表达式来查看这样的字符串,并返回恰好出现在“{”和“}”之间的字符串中的所有子字符串。在我们上面的第一个示例等式中,我想返回 Temp_in_degrees 。在一个更复杂(但无意义)的例子中:
({Temp_in_degrees} / {Speed}) * 30;
我想返回 Temp_in_degrees 和速度(或者,循环并处理找到的每个字符串)
由于用户能够自定义他们的模型,我不能假设我们总是会有相同名称的字符串。
我确实有另一个想法来解决这个问题,我使用String.indexOf来解决它,通过循环字符串,获取索引,获取这些索引之间的子串,然后将原始数据中的值替换为字符串并重复,但感觉这是RegEx应该能够提供的帮助。
有什么想法吗?
答案 0 :(得分:1)
如果您打算使用正则表达式,那么以下内容可能有所帮助:
尝试以下方法:
String input = "({Temp_in_degrees} / {Speed}) * 30;";
Pattern pattern = Pattern.compile("\\{\\S+\\}");
Scanner scanner = new Scanner(input);
String output;
while ((output = scanner.findInLine(pattern)) != null) {
System.out.println(output);
}
scanner.close();
答案 1 :(得分:0)
我将为您要提取({Temp_in_degrees} / {Speed}) * 30;"
和/或Temp_in_degrees
Speed
提供正则表达式
/\(\{(\w+)\}\s*[\/]?\s*\{(\w+)\}\)\s*/
我使用括号(
和)
的原因是您可以打印或写为组。例如,在这种情况下,如果您打印group(1)
,您将获得Temp_in_degrees
而group(2)
会打印Speed
。