我需要用(.)分隔一个句子,但是我遇到了数字。我如何定义一个不包括数字之间的点的分隔(.)?
示例:
“我付了1000美元。非常贵。但我想今天应该便宜一些。”"我得到了这个"我付了1.000美元。非常昂贵。但我认为今天应该更便宜。
但我需要这个
我付了1000美元。非常昂贵。但我认为今天应该更便宜。
nlejzf6q1#
使用this答案中的正则表达式,您可以执行以下操作:
public static String[] split(String str) { return str.split("[\\.\\!]+(?!\\d)\\s*|\\n+\\s*"); }
结果是:
I paid 1.000 dollars Very expensive But I think today it should be cheaper
regex101.com
mwg9r5ms2#
只需使用negativa查看:
String textToParse = "I paid 1.000 dollars. Very expensive. But I think today it should be cheaper."; String[] chunks = textToParse.split("(?<!\\d)\\.(?!\\d)"); for(int i = 0; i < chunks.length; i++){ System.out.println(chunks[i].trim()); }
说明:我使用了negativa lookahead,它Assert后面的内容与指定的模式不匹配,因此(?!\d)保证我们将匹配,如果文本后面没有任何数字\d。我也用了negativa lookbehind,但是它和上面的完全等价,但是只看文本前面的内容,而不是后面的内容,所以同样的,我们保证前面的内容不是数字。
(?!\d)
\d
bmvo0sr53#
正则表达式在输入字符串过长时性能较低。您可以访问每个字符以验证点的位置并拆分它。例如:
public static void main(String[] args) { String str = "I paid 1.000 dollars. Very expensive. But I think today it should be cheaper."; StringBuilder sb = new StringBuilder(64); int i =0, length = str.length(); for (; i < length - 1; i++) { char ch = str.charAt(i); if (ch == '.' && str.charAt(i + 1) == ' ') { System.out.println(sb.append(ch)); sb.setLength(0); // Reset buffer i++; // Skip the empty char continue; } sb.append(ch); } System.out.println(sb.append(str.substring(i))); }
3条答案
按热度按时间nlejzf6q1#
使用this答案中的正则表达式,您可以执行以下操作:
结果是:
regex101.com
mwg9r5ms2#
只需使用negativa查看:
说明:
我使用了negativa lookahead,它Assert后面的内容与指定的模式不匹配,因此
(?!\d)
保证我们将匹配,如果文本后面没有任何数字\d
。我也用了negativa lookbehind,但是它和上面的完全等价,但是只看文本前面的内容,而不是后面的内容,所以同样的,我们保证前面的内容不是数字。
bmvo0sr53#
正则表达式在输入字符串过长时性能较低。您可以访问每个字符以验证点的位置并拆分它。例如: