拉丁语正则表达与符号

时间:2013-02-12 12:51:17

标签: java regex split symbols latin

我需要拆分文本,只获得单词,数字和带连字符的组合词。我也需要拉丁语,然后我使用了\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.

3 个答案:

答案 0 :(得分:2)

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

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

它将匹配:

  • Unicode Latin script个字符的连续序列。我将其限制为拉丁文脚本,因为\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+"

我还在角色类-中转义['\\-],以防您想要添加更多内容。实际上-如果它是角色类中的第一个或最后一个,则不需要转义,但为了安全起见我无论如何都要逃避它。

答案 1 :(得分:2)

如果字符类的左括号后跟^,则不允许在类中列出的字符。所以你的正则表达式允许之外的任何内容,+(-)*和数字出现的或更多次。

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

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

例如考虑这个

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

输出

  

==&GT; SD

     

==&GT;

     

==&GT; f g

答案 2 :(得分:0)

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