需要正则表达式帮助

时间:2011-08-25 09:05:54

标签: regex

有人可以用正则表达式帮我吗?我有一个数字字符串,如:

X024123099XYAAXX99RR

我需要一个正则表达式来检查用户是否插入了正确的信息。该规则还应具有从左到右检查输入的后备。

例如,测试时,这些输入应返回TRUE:

X024

X024123099X

X024123099XYA

X024123099XYAAXX99R

这些应该返回FALSE:

XX024

X02412AA99X

X024123099XYAAXX9911

等等。正则表达式必须从左侧开始检查正确的语法。 我有类似的东西,但这似乎不正确:

 \w\d{0,12}\w{0,6}\d{0,2}\w{0,2}

非常感谢任何帮助(我是regex的新手)

2 个答案:

答案 0 :(得分:1)

如果我理解正确,你的字符串应该匹配正则表达式

[A-Z]\d{9}[A-Z]{6}\d{2}[A-Z]{2}

但您还想检查字符串是否可以是匹配字符串的前缀,这是正确的吗?你可以在一个正则表达式中表达这一点,但我想不出一种易于阅读的方法。

你还没有说过你正在使用哪种语言,但是如果你的语言能够让你在检查正则表达式时告诉输入字符串的结尾是否已经达到,那么这将为你提供一个简单的方法想。例如。在java中,方法Matcher.hitEnd告诉您是否到达了结尾,所以下面的代码:

static Pattern pattern = Pattern.compile( "[A-Z]\\d{9}[A-Z]{6}\\d{2}[A-Z]{2}" );
static Matcher matcher = pattern.matcher( "" );

public static void main(String[] args) {
  String[] strings = {
      "X024",
      "X024123099X",
      "X024123099XYA",
      "X024123099XYAAXX99R",
      "XX024",
      "X02412AA99X",
      "X024123099XYAAXX9911"
  };
  for ( String string : strings ) {
    out.format( "%s %s\n", string, inputOK(string) ? "OK" : "not OK" );
  }
}

static boolean inputOK(String input) {
  return matcher.reset(input).matches() || matcher.hitEnd();
}

给出输出:

X024 OK
X024123099X OK
X024123099XYA OK
X024123099XYAAXX99R OK
XX024 not OK
X02412AA99X not OK
X024123099XYAAXX9911 not OK

答案 1 :(得分:1)

您可以使用OpenSauce的正则表达式,然后将其破解为允许部分匹配:

^[A-Z](\d{0,9}$|\d{9}([A-Z]{0,6}$|[A-Z]{6}(\d{0,2}$|\d{2}([A-Z]{0,2}$))))

它并不漂亮但据我所知它可以编码你的要求。

基本上我把\d{9}之类的每个案例都用(\d{0,9}$|\d{9}<rest of regex>)替代了。

我添加了^$,否则它会匹配其他无效字符串中的子字符串。例如,它会看到一个无效的字符串,例如XX024,并认为它没问题,因为它包含X024