java - 按标点符号保存分割

标签 java regex

我需要将 Java 字符串安全地拆分为单词和标点符号。

我已经尝试过这段代码,但有问题,它不能正确分隔括号。

String sentenceString = "Hello from the outside(outside).";
sentenceString.split("(?=,|\\.|!|\\?|\\(|\\))|\\s");

实际结果是

["Hello", "from", "the", "outside", "", "(outside", ")", "."]

预期结果应该是

["Hello", "from", "the", "outside", "(", "outside", ")", "."]

最佳答案

您应该尝试匹配正则表达式来获得所需的输出,而不是拆分。尝试在 Java 中使用这个正则表达式,

[a-zA-Z]+|\\p{Punct}

这里 [a-zA-Z]+ 部分匹配一个或多个字母,\\p{Punct} 部分匹配任何标点符号,如果您熟悉POSIX表示,那么它相当于[[:punct:]]。尝试将类似解决方案应用于支持 POSIX 表示的语言/工具的人们可以使用 [a-zA-Z]+|[[:punct:]] 正则表达式。

Java 代码,

List<String> list = new ArrayList<String>();
String s = "Hello from the outside(outside).";
Pattern p = Pattern.compile("[a-zA-Z]+|\\p{Punct}");
Matcher m = p.matcher(s);
while (m.find()) {
    list.add(m.group());
}
System.out.println(list);

按照您想要的方式打印输出,

[Hello, from, the, outside, (, outside, ), .]

编辑:感谢Andreas感谢他的好建议。如果您不仅想包含英语字母,还想包含其他语言的字母,那么最好使用此正则表达式,

\\p{L}+|\\p{P}

因为,\\p{L} 不仅涵盖英语,还涵盖以 Unicode 表示的任何其他语言的字母表。

但是,请注意,这可能会稍微增加性能成本,因为现在,它可能不仅尝试匹配 [a-z],还尝试匹配其他 Unicode 字符。因此需要进行一些权衡,因此请使用更适合您需求的那个。

再次感谢 Andreas 的宝贵建议。

关于java - 按标点符号保存分割,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55443915/

相关文章:

java - ArrayList 中的 clone() 方法,为什么是 Arrays.copyOf()?

javascript - Cordova 配置中的 errorUrl 在 Android 上不起作用

ios - 为社会保障号 Swift 创建函数

Java swagger 与 JaxRS 抛出错误

javafx 应用程序中 java.awt.Desktop.isDesktopSupported 返回 false

java - 如何配置 BIRT Report Engine 以直接从类路径加载字体?

python - Pandas:使用正则表达式替换列中的值

Java 版本号的正则表达式

regex - Ruby str.match(regex) 返回只包含第一个匹配项的 MatchData

python re.sub 和 re.search 无法按预期工作