【发布时间】:2017-01-06 09:05:06
【问题描述】:
我有一个包含一些数学表达式的文本文件。 我需要使用正则表达式将文本解析为组件(单词、句子、标点符号、数字和算术符号),计算数学表达式并使用计算出的数字表达式以原始形式返回文本。 我在没有正则表达式的情况下完成了这个(没有计算)。现在我正在尝试使用正则表达式来做到这一点。 我不完全理解如何正确地做到这一点。输入文字是这样的:
Pete 喜欢数学 5+3 和 jesica too sin(3)。
在我需要的输出中:
Pete 喜欢数学 8,jesica 也喜欢 0,14。
我需要一些知道如何做到这一点的人的正则表达式和计算方面的建议。
我的代码:
final static Pattern PUNCTUATION = Pattern.compile("([\\s.,!?;:]){1,}");
final static Pattern LETTER = Pattern.compile("([а-яА-Яa-zA-Z&&[^sin]]){1,}");
List<Sentence> sentences = new ArrayList<Sentence>();
List<PartOfSentence> parts = new ArrayList<PartOfSentence>();
StringTokenizer st = new StringTokenizer(text, " \t\n\r:;.!?,/\\|\"\'",
true);
带有正则表达式的代码(不起作用):
while (st.hasMoreTokens()) {
String s = st.nextToken().trim();
int size = s.length();
for (int i=0; i<s.length();i++){
//with regex. not working variant
Matcher m = LETTER.matcher(s);
if (m.matches()){
parts.add(new Word(s.toCharArray()));
}
m = PUNCTUATION.matcher(s);
if (m.matches()){
parts.add(new Punctuation(s.charAt(0)));
}
Sentence buf = new Sentence(parts);
if (buf.getWords().size() != 0) {
sentences.add(buf);
parts = new ArrayList<PartOfSentence>();
} else
parts.add(new Punctuation(s.charAt(0)));
没有正则表达式(工作):
if (size < 1)
continue;
if (size == 1) {
switch (s.charAt(0)) {
case ' ':
continue;
case ',':
case ';':
case ':':
case '\'':
case '\"':
parts.add(new Punctuation(s.charAt(0)));
break;
case '.':
case '?':
case '!':
parts.add(new Punctuation(s.charAt(0)));
Sentence buf = new Sentence(parts);
if (buf.getWords().size() != 0) {
sentences.add(buf);
parts = new ArrayList<PartOfSentence>();
} else
parts.add(new Punctuation(s.charAt(0)));
break;
default:
parts.add(new Word(s.toCharArray()));
}
} else {
parts.add(new Word(s.toCharArray()));
}
}
【问题讨论】: