我是初学者正则表达式。当我们使用正则表达式验证字符串时,有什么方法可以找到不匹配的点或字符索引吗?我用Java中的RegEx来验证字符串。
我只需要找到第一个不匹配的索引。
更新
请考虑这样的例子。
正则表达式:^ \ d {9} [VX] $
接受字符串:547812375X
错误字符串:547A12375X
正则表达式:查找不匹配点(或字符索引)
在错误的字符串有一个,而不是8.我需要的是找到匹配指数,因为这里是4.索引处的字符与RegEx不匹配。
我是初学者正则表达式。当我们使用正则表达式验证字符串时,有什么方法可以找到不匹配的点或字符索引吗?我用Java中的RegEx来验证字符串。
我只需要找到第一个不匹配的索引。
更新
请考虑这样的例子。
正则表达式:^ \ d {9} [VX] $
接受字符串:547812375X
错误字符串:547A12375X
正则表达式:查找不匹配点(或字符索引)
在错误的字符串有一个,而不是8.我需要的是找到匹配指数,因为这里是4.索引处的字符与RegEx不匹配。
我觉得这个代码可以做你想做的:
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"));
}
}
感谢您的帮助。 :)这正是我想要的。 – SachiraChin
在Java 8或更高版本(或使用番石榴等)中,更好的方法是返回“Optional
恐怕你不能使用普通的正则表达式尽管没有输入和期望的输出,我们真的不能告诉做到这一点。 – FailedDev
@FailedDev我在那里添加了一个例子。请帮我解决这个问题。谢谢。 – SachiraChin
您可能需要* index 3 *作为响应,因为字符串在Java中具有从零开始的索引。对于人类用户,您当然想要将其翻译为* index 4 *。 –