2011-10-16 74 views
4

我是初學者正則表達式。當我們使用正則表達式驗證字符串時,有什麼方法可以找到不匹配的點或字符索引嗎?我用Java中的RegEx來驗證字符串。
我只需要找到第一個不匹配的索引。
更新
請考慮這樣的例子。
正則表達式:^ \ d {9} [VX] $
接受字符串:547812375X
錯誤字符串:547A12375X
正則表達式:查找不匹配點(或字符索引)

在錯誤的字符串有一個,而不是8.我需要的是找到匹配指數,因爲這裏是4.索引處的字符與RegEx不匹配。

+0

恐怕你不能使用普通的正則表達式儘管沒有輸入和期望的輸出,我們真的不能告訴做到這一點。 – FailedDev

+2

@FailedDev我在那裏添加了一個例子。請幫我解決這個問題。謝謝。 – SachiraChin

+0

您可能需要* index 3 *作爲響應,因爲字符串在Java中具有從零開始的索引。對於人類用戶,您當然想要將其翻譯爲* index 4 *。 –

回答

5

我覺得這個代碼可以做你想做的:

package so7783938; 

import static org.junit.Assert.assertEquals; 

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

import org.junit.Test; 

public class RegexFailureTest { 

    public static int firstFailurePoint(Pattern regex, String str) { 
    for (int i = 0; i <= str.length(); i++) { 
     Matcher m = regex.matcher(str.substring(0, i)); 
     if (!m.matches() && !m.hitEnd()) { 
     return i - 1; 
     } 
    } 
    if (regex.matcher(str).matches()) { 
     return -1; 
    } else { 
     return str.length(); 
    } 
    } 

    @Test 
    public void testSimple() { 
    Pattern abc = Pattern.compile("abc"); 
    assertEquals(0, firstFailurePoint(abc, "")); 
    assertEquals(1, firstFailurePoint(abc, "a")); 
    assertEquals(2, firstFailurePoint(abc, "ab")); 
    assertEquals(-1, firstFailurePoint(abc, "abc")); 
    assertEquals(3, firstFailurePoint(abc, "abcd")); 
    assertEquals(3, firstFailurePoint(abc, "abcdefghi")); 
    assertEquals(1, firstFailurePoint(abc, "aaa")); 
    assertEquals(2, firstFailurePoint(abc, "abb")); 
    } 

    @Test 
    public void testAlternative() { 
    Pattern regex = Pattern.compile("hello|world"); 
    assertEquals(0, firstFailurePoint(regex, "x")); 
    assertEquals(-1, firstFailurePoint(regex, "hello")); 
    assertEquals(-1, firstFailurePoint(regex, "world")); 
    assertEquals(3, firstFailurePoint(regex, "hel")); 
    assertEquals(5, firstFailurePoint(regex, "hello kitty")); 
    assertEquals(3, firstFailurePoint(regex, "help me")); 
    assertEquals(3, firstFailurePoint(regex, "worse is better")); 
    } 

    @Test 
    public void testExample() { 
    Pattern regex = Pattern.compile("^\\d{9}[VX]$"); 
    assertEquals(-1, firstFailurePoint(regex, "547812375X")); 
    assertEquals(3, firstFailurePoint(regex, "547A12375X")); 
    } 

} 
+0

感謝您的幫助。 :)這正是我想要的。 – SachiraChin

+0

在Java 8或更高版本(或使用番石榴等)中,更好的方法是返回「Optional 」而不是-1作爲「魔法值」 - 如果您更喜歡這些面向對象的構造。 –