Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带符号的拉丁正则表达式_Java_Regex_Split_Symbols_Latin - Fatal编程技术网

Java 带符号的拉丁正则表达式

Java 带符号的拉丁正则表达式,java,regex,split,symbols,latin,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 c

我需要拆分一个文本,只得到单词,数字和连字号组成的单词。我还需要得到拉丁语单词,然后我使用了
\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 );
正则表达式的解释是:

[^\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.

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

"\\p{IsLatin}+(?:-\\p{IsLatin}+)*|\\d+"
它将匹配:

  • Unicode字符的连续序列。我将其限制为拉丁语脚本,因为
    \p{L}
    将匹配任何脚本中的字母。如果您的Java版本不支持语法,请将
    \\p{IsLatin}
    更改为
    \\pL
  • 或几个这样的序列,连字符
  • 或连续的十进制数字序列(0-9)
上面的正则表达式将通过调用
模式来使用。编译
,并调用
匹配器(字符串输入)
,以获得
匹配器
对象,并使用循环查找匹配项

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+"

我还在character类
['\\-]
中转义
-
,以防您想添加更多。实际上,
-
如果它是字符类中的第一个或最后一个,则不需要转义,但为了安全起见,我还是转义它。

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

如果字符类的开头括号后面跟着
^
,则不允许在类内列出字符。因此,您的正则表达式允许除unicode字母、
+
-
*
和数字出现一次或多次之外的任何内容

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

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

例如,考虑这个

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

==>sd

==>

=>f g


你对正则表达式的理解是不正确的<代码>[]
是字符类,只匹配一个字符。是的,它是除此之外的任何字符,因为它用于拆分文本。请参阅:pattern.split(myText)@ManoelMerc我想你误解了pattern.splitIt给了我一个错误:索引12[^\p{IsLatin}+(?:-\p{IsLatin}+)*|\d+]@ManoelMerc附近的未知字符属性名{Latin}+(?:-\p{IsLatin}+)@ManoelMerc:代码可以在Java 7上运行。如果您的版本不支持,则可以恢复到
\\p{L}
。不要修改正则表达式!好啊我们快到了!我可以得到所有的字没有错误!谢谢!但管道符号“|”也作为一个单词匹配。我修不好!这是我的代码:Pattern Pattern=Pattern.compile(\\p{L}+(?:-\\p{L}+)*|\\d+);Matcher Matcher=pattern.Matcher(strText.toLowerCase());ArrayList words=新的ArrayList();while(matcher.find()){words.add(matcher.group());}返回words.toArray(新字符串[words.size())@ManoelMerc:
|
从未作为单词匹配。这只是正则表达式中的交替。一些结果是:“dresse”//OK“sud est”//OK“|”//错了编译器认为pipe“|”是一个单词,而它不是。我已将其更改为“\(++124;\)+\*++\\\\\\\\\+\\-+\\\+\\[^\\ p{L}+(\-\\p{L}+*\\\\\\+\\\\\\+\\+\\+\\+\\+\+\+\+\\+\\\\\\+++\\\\\+++\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\反正是匹配的…:-(
Pattern pattern = Pattern.compile("a");
    for (String s : pattern.split("sda  a  f  g")) {
        System.out.println("==>"+s);
    }