簡體   English   中英

相同正則表達式的Pattern / Matcher vs String.split()

[英]Pattern/Matcher vs String.split() for the same regex

為什么Pattern / Matcher與(\\\\d+)([a-zA-Z]+)但是String.split()不起作用?

例如:

String line = "1A2B";

Pattern p = Pattern.compile("(\\d+)([a-zA-Z]+)");
Matcher m = p.matcher(line);
System.out.println(m.groupCount());

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

版畫:

2
1A
2B

但是:

    String line = "1A2B";
    String [] arrayOfStrings = line.split("(\\d+)([a-zA-Z]+)");
    System.out.println(arrayOfStrings.length);

    for(String elem: arrayOfStrings){
        System.out.println(elem);
    }

僅打印:

0

這是因為.split(String regex)使用正則表達式來標記要在何處斷開字符串。 因此,在您的情況下,如果您有1A2B£$%^&它將打印1個字符串: £$%^&因為它將在1A處拆分,然后在2B處再次拆分,但是,由於這些返回空組,因此將它們省略並您只剩下£$%^&

另一方面,正則表達式的作用是匹配字符串並將它們分組。 然后,您可以在以后的階段訪問這些組。

為什么它不起作用

因為吐痰會消耗這些字符,並且輸出列表中沒有剩余字符

並不完美,但展望未來將為您提供幫助

String line = "1A2B";
String [] arrayOfStrings = line.split("(?=\\d+[a-zA-Z]+)");
System.out.println(arrayOfStrings.length);

for(String elem: arrayOfStrings){
    System.out.println(elem);

將輸出為

3

1A
2B

並不是很完美,因為前瞻在字符串的開頭是正確的,因此在輸出列表中的索引0處創建了一個空字符串。在示例中,您可以看到長度為3,而我們期望的是2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM