簡體   English   中英

matcher.find()匹配太多

[英]matcher.find() matches too much

我對Matcher的find()方法返回比我認為的正則表達式會更多的匹配感到困惑。 下面是我編寫的JUnit測試,試圖將其哈希化。 所有測試都通過了,但是我不明白為什么我的find()返回的group(1)值為null或為空的匹配項(請參見//為什么find()比實際匹配的項多?在代碼中推薦)?

public class JustTheDigits {
    @Test
    public void testJustTheDigits() {
        doTest( "DV_APLCN: 563 ,DV_DHR_APLCN: 5632, PIC_NOTE: 6254", new ArrayList<Integer>( Arrays.asList( 563, 5632, 6254 ) ) );
        doTest( "563 ,DV_DHR_APLCN: 5632, PIC_NOTE", new ArrayList<Integer>( Arrays.asList( 563, 5632 ) ) );
        doTest( "hello 563 jello", new ArrayList<Integer>( Arrays.asList( 563 ) ) );
        doTest( "Hello World", new ArrayList<Integer>() );
    }

    private void doTest( String candidate, List<Integer> expected ) {
        List<Integer> actual = justTheDigits( candidate );
        assertEquals( expected, actual );
    }

    private static Pattern pattern = Pattern.compile( "(\\d+)?" );

    public List<Integer> justTheDigits( String input ) {
        List<Integer> listOfDigits = new ArrayList<Integer>();
        Matcher matcher = pattern.matcher( input );
        while ( matcher.find() ) {
            String s = matcher.group( 1 );
            // Why more find()s than actual matches?
            if ( s != null && "".equals( s ) == false ) {
                listOfDigits.add( Integer.parseInt( s ) );
            }
        }
        return listOfDigits;
    }
}

我可以對正則表達式執行什么操作來避免流血的非null或空支票?

刪除? 因此,當有一個或多個數字序列出現一次或多次時,正則表達式就是匹配的,因此正則表達式只是(\\\\d+) 即使沒有數字,正則表達式也將匹配。

問號表示上一條語句是可選的。 用字面意義來說,您要求輸入0或1(至少1個數字)。

將模式更改為"\\\\d+" ,它應該可以正常工作。

請閱讀以下內容: http : //docs.oracle.com/javase/tutorial/essential/regex/quant.html

我相信您是在說您要一個包含一個或一個以上數字的組顯示一次或完全不顯示。 這就是為什么如果找不到它仍會返回一個匹配項的原因。 我不確定您要做什么,但我認為您使用“ \\ d +”可能會很好

暫無
暫無

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

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