4

我需要拆分文本并仅获取单词、数字和带连字符的组合词。我还需要获取拉丁词,然后我使用\p{L}了 é,ú ü ã 等等。例子是:

String myText = "Some latin text with symbols, ? 987 (A la pointe sud-est de l'île se dresse la cathédrale Notre-Dame qui fut lors de son achèvement en 1330 l'une des plus grandes cathédrales d'occident) : ! @ # $ % ^& * ( ) + - _ #$% "  ' : ; > < / \  | ,  here some is wrong… * + () e -"

Pattern pattern = Pattern.compile("[^\\p{L}+(\\-\\p{L}+)*\\d]+");
String words[] = pattern.split( myText );

这个正则表达式有什么问题?为什么它匹配"(", "+", "-","*""|"?

一些结果是:

dresse     // OK
sud-est    // OK
occident)  // WRONG
987        // OK
()         // WRONG
(a         // WRONG
*          // WRONG
-          // WRONG
+          // WRONG
(          // WRONG
|          // WRONG

正则表达式的解释是:

[^\p{L}+(\-\p{L}+)*\d]+

 * Word separator will be:
 *     [^  ...  ]  No sequence in:
 *     \p{L}+        Any latin letter
 *     (\-\p{L}+)*   Optionally hyphenated
 *     \d            or numbers
 *     [ ... ]+      once or more.
4

3 回答 3

3

如果我对您的要求的理解是正确的,则此正则表达式将符合您的要求:

"\\p{IsLatin}+(?:-\\p{IsLatin}+)*|\\d+"

它将匹配:

  • Unicode拉丁脚本字符的连续序列。我将其限制为拉丁文字,因为\p{L}它将匹配任何文字中的字母。如果您的 Java 版本不支持该语法,请更改\\p{IsLatin}为。\\pL
  • 或几个这样的序列,连字符
  • 或连续的十进制数字序列 (0-9)

上面的正则表达式是通过调用来使用的Pattern.compile,调用matcher(String input)来获取Matcher对象,并使用循环来查找匹配项。

Pattern pattern = Pattern.compile("\\p{IsLatin}+(?:-\\p{IsLatin}+)*|\\d+");
Matcher matcher = pattern.matcher(inputString);

while (matcher.find()) {
    System.out.println(matcher.group());
}

如果您想允许带有撇号的单词'

"\\p{IsLatin}+(?:['\\-]\\p{IsLatin}+)*|\\d+"

我也在-字符类中转义,['\\-]以防万一你想添加更多。如果它是角色类中的第一个或最后一个,实际上-不需要转义,但为了安全起见,我无论如何都会转义它。

于 2013-02-12T13:01:47.707 回答
2

如果字符类的左括号后面跟着 a,^那么类中列出的字符是不允许的。因此,您的正则表达式允许unicode 字母、、 、 、+(digit-出现一次或多次之外的任何内容。)*

请注意,像+, (,)*这样的字符在字符类中没有任何特殊含义。

pattern.split 所做的是将字符串拆分为与正则表达式匹配的模式。您的正则表达式匹配空格,因此每次出现一个或多个空格时都会发生拆分。所以结果会是这样。

例如考虑这个

Pattern pattern = Pattern.compile("a");
    for (String s : pattern.split("sda  a  f  g")) {
        System.out.println("==>"+s);
    }

输出将是

==>sd

==>

==> fg

于 2013-02-12T13:06:05.193 回答
0

正则表达式集描述[]只能包含字母、类 ( \p{...})、序列 (eg a-z) 和补码符号 ( ^)。您必须将您正在使用的其他魔法字符 ( )+*()放在块之外[ ]

于 2013-02-12T13:01:54.503 回答