保留连字符,除非在带有正则表达式的单词末尾



我正在尝试将文本文件加载到我的java程序中。因此,我编写了以下正则表达式:

lineWords = line.replaceAll("[^a-zA-Z\- ]", " ").toLowerCase().split("\s+");

这通常可以很好地保留带连字符的单词,但输入文件中的一个单词以连字符结尾(不幸的是我无法控制这一点(。我一直在寻找一种方法来保留单词中的连字符,但如果它们位于单词末尾,则将其删除。任何想法将不胜感激。

要保留连字符,除非在单词的末尾,你可以使用交替。

要么匹配除字符类中列出的字符之外的任何字符,要么匹配连字符并使用环顾四周,断言左侧的内容是单词字符,右侧的内容不是非空格字符。

(?:[^a-zA-Z -]|(?<=w)-(?!S))

在部分

  • (?:非捕获组
    • [^a-zA-Z -]匹配除列出的字符之外的任何字符
    • |
    • (?<=w)-(?!S)断言左边的内容是单词字符,断言右侧的内容不是非空格字符
  • )关闭组

正则表达式演示 |爪哇演示

在爪哇语中

(?:[^a-zA-Z -]|(?<=\w)-(?!\S))

例如

String line = "this is a test $%$ test- test-test and -test ()";
String[] lineWords = line.replaceAll("(?:[^a-zA-Z -]|(?<=\w)-(?!\S))", " ").toLowerCase().split("\s+");
System.out.println(Arrays.toString(lineWords));

输出

[this, is, a, test, test, test-test, and, -test]

String line = "a-b c-d- e-f g-e r- st-u-";
System.out.println(line);
line = Arrays.stream(line.split("\s+")).map(
s -> s.replaceAll("-$", "")).collect(Collectors.joining(" "));
System.out.println(line);

指纹

a-b c-d- e-f g-e r- st-u-
a-b c-d e-f g-e r st-u

如果您想将该行保留为单独的单词,那么只需执行此操作。

String [] words = Arrays.stream(line.split("\s+")).map(
s -> s.replaceAll("-$", "")).toArray(String[]::new);

您可以按如下方式执行此操作:

String str = line.replaceAll("[^a-zA-Z\- ]", " ").toLowerCase();
str = str.charAt(str.length() - 1) == '-' ? str.substring(0, str.length() - 1) : str;
lineWords = str.split("\s+");

快速演示:

import java.util.Arrays;
public class Lab7BTest {
public static void main(String[] args) {
String line = "This word-list contains a word ending with -";
String str = line.replaceAll("[^a-zA-Z\- ]", " ").toLowerCase();
str = str.charAt(str.length() - 1) == '-' ? str.substring(0, str.length() - 1) : str;
String []lineWords = str.split("\s+");
System.out.println(Arrays.toString(lineWords));
line = "This word-list contains a word ending with hyphen";
str = line.replaceAll("[^a-zA-Z\- ]", " ").toLowerCase();
str = str.charAt(str.length() - 1) == '-' ? str.substring(0, str.length() - 1) : str;
lineWords = str.split("\s+");
System.out.println(Arrays.toString(lineWords));
}
}

输出:

[this, word-list, contains, a, word, ending, with]
[this, word-list, contains, a, word, ending, with, hyphen]

最新更新