java 除数字外,使用(.)拆分

dxxyhpgq  于 2022-12-17  发布在  Java
关注(0)|答案(3)|浏览(129)

我需要用(.)分隔一个句子,但是我遇到了数字。我如何定义一个不包括数字之间的点的分隔(.)?

示例:

“我付了1000美元。非常贵。但我想今天应该便宜一些。”
"我得到了这个"
我付了1.
000美元。
非常昂贵。
但我认为今天应该更便宜。

但我需要这个

我付了1000美元。
非常昂贵。
但我认为今天应该更便宜。

nlejzf6q

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

mwg9r5ms

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,但是它和上面的完全等价,但是只看文本前面的内容,而不是后面的内容,所以同样的,我们保证前面的内容不是数字。

bmvo0sr5

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)));
    }

相关问题