【问题标题】:Regular Expressions : Find mismatched point (or char index)正则表达式:查找不匹配的点(或字符索引)
【发布时间】:2011-10-16 19:55:11
【问题描述】:

我是正则表达式的初学者。当我们使用正则表达式验证字符串时,有什么方法可以找到不匹配的点或字符索引?我在 Java 中使用 RegEx 来验证字符串。
我只需要找到第一个不匹配的索引。
更新
请考虑这样的例子。
正则表达式:^\d{9}[VX]$
接受的字符串:547812375X
错误的字符串:547A12375X

在错误的字符串中,有 A 而不是 8。我需要找到不匹配的索引,因为这里是 4。索引处的字符与 RegEx 不匹配。

【问题讨论】:

  • 恐怕你不能通过使用普通的正则表达式来做到这一点,尽管没有输入和所需的输出我们无法真正分辨。
  • @FailedDev 我在那里添加了一个示例。请帮我解决这个问题。谢谢。
  • 您可能希望 index 3 作为响应,因为字符串在 Java 中具有从零开始的索引。对于人类用户,您当然希望将其转换为 index 4

标签: java regex


【解决方案1】:

我认为这段代码可能会做你想做的事:

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"));
  }

}

【讨论】:

  • 感谢您的帮助。 :) 这正是我想要的。
  • 在 Java 8 或更高版本(或使用 Guava 等)中,返回 Optional&lt;Integer&gt; 而不是 -1 作为“神奇值”会更好 - 如果您更喜欢这些面向对象的构造.
猜你喜欢
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 2017-08-29
  • 1970-01-01
  • 2019-07-25
  • 2013-02-19
  • 2010-09-11
  • 1970-01-01
相关资源
最近更新 更多