如何在使用RegEx时保留分隔符



我做了一个关于标点符号和正则表达式的问题,但是它让人困惑。

假设我有这样的文本:

String text = "wor.d1, :word2. wo,rd3? word4!"; 

我正在做这个:

String parts[] = text.split(" ");

我有这个:

wor.d1, | :word2. | wor,d3? | word4!;

我需要做什么来得到这个?(保留边界的符号,但只有我指定的:.,!?:,而不是全部)。

wor,d1 | , | : | word2 | . | wor,d3 | ? | word4 | !

更新

我用这些正则表达式得到了一些很好的结果,但是它在单词开头的标点符号的所有分割之前给出了一个空字符。

有一种方法可以不让这个空字符开始吗?

这个正则表达式是好的,还是有一个更简单的方法?

public static final String PUNCTUATION_SEPARATOR =
        "("
        + "("
        + "(?=^["'!?.,;:(){}\[\]]+)"
        + "|"
        + "(?<=^["'!?.,;:(){}\[\]]+)"
        + ")"
        + "|"
        + "("
        + "(?=["'!?.,;:(){}\[\]]+($|n))"
        + "|"
        + "(?<=["'!?.,;:(){}\[\]]+($|n))"
        + ")"
        + ")";

您确定要使用正则表达式吗?有一种更快的按单个字符分割的实现:StringTokenizer。它可以返回分隔符

String str= "word1, word2. word3? word4!";
String delim = ",.!?";
StringTokenizer st = new StringTokenizer(str, delim, true);
while (st.hasMoreTokens()) {
  String token = st.nextToken();
  ... // token will be: "word1", ",", " word2", ".", etc...
}

对于简单分隔符,我推荐使用StringTokenizer。但这里有一个解决方案,使用regex和另一个辅助分隔符:

String s  = "one,two, three   four ,  five";
s = s.replaceAll("([,\s]+)", "#$1#");
Pattern p = Pattern.compile("#");
String[] result = p.split(s);

这里有一个我认为会工作的正则表达式:

/s|(?=[.,:?!](W|$))|(?<=W[.:?!])/

在我看来你需要这个。首先,你爆破你的字符串,第二步,你使用内爆函数

public static final String PUNCTUATION_SEPARATOR =
    "("
    + "("
    + "(?=^["'!?.,;:(){}\[\]-]+)"
    + "|"
    + "(?<=^["'!?.,;:(){}\[\]-]+)"
    + ")"
    + "|"
    + "("
    + "(?=["'!?.,;:(){}\[\]-]+($|n))"
    + "|"
    + "(?<=["'!?.,;:(){}\[\]-]+($|n))"
    + ")"
    + ")";

相关内容

  • 没有找到相关文章

最新更新