为指定的String创建正则表达式模式

时间:2014-12-02 14:11:27

标签: android regex string pattern-matching

我想检查String是否具有指定的结构。我认为正则表达式是测试字符串的最佳方法,但我之前从未使用过正则表达式,并且遗憾地不知道它是如何工作的。我在stackoverflow上看了一些解释,但是我无法找到一个很好的解释如何创建正则表达式模式。

我的String从DataMatrix扫描仪返回。例如

 String contained = "~ak4,0000D"

现在我想测试这个String,如果它与正则表达式中的模式匹配。

String每次都使用"〜"。

启动

在此之后,在这个例子中跟随两个较低的套装字符" ak"。

在此之后,出现六个字符的长值" 4,0000"。这里的主要问题是,因为逗号可以位于此值的任何位置,但逗号必须包含在其中。例如,它可以是",16000"或" 150,00"或" 2,8000"。

在最后一个位置,必须有一个大写字母A B C D E F G H J K L M.

我希望你们中的一些人可以帮助我。

4 个答案:

答案 0 :(得分:2)

正则表达式为~[a-z]{2}(?=[\d\,]{6})((\d)*\,(\d)*)[A-H|J-M]{1}$您可以创建和测试表达式here

boolean isMatch(String STRING_YOU_WANT_TO_MATCH)
{
    Pattern patt = Pattern.compile(YOUR_REGEX_PATTERN);
    Matcher matcher = patt.matcher(STRING_YOU_WANT_TO_MATCH);
    return matcher.matches();
}

答案 1 :(得分:1)

关于正则表达式,您需要了解的一件事是它们是系列的东西,而不是一个特定的东西。有许多不同但相似的正则表达式语言,支持它们的设施从编程语言到编程语言各不相同。

这是一个正则表达式模式,可以在大多数正则表达式语言中使用以匹配您的字符串:

"^~[a-z][a-z]((,[0-9][0-9][0-9][0-9][0-9])|([0-9],[0-9][0-9][0-9][0-9])|([0-9][0-9],[0-9][0-9][0-9])|([0-9][0-9][0-9],[0-9][0-9])|([0-9][0-9][0-9][0-9],[0-9])|([0-9][0-9][0-9][0-9][0-9],))[A-HJ-M]$"

'^'将模式锚定到字符串的开头,'$'将其锚定到结尾,这样模式必须匹配整个字符串而不是子字符串。方括号中的字符表示“字符类”,它们恰好与一个集合中的一个字符匹配,两个字符用“ - ”分隔,表示一系列字符。 '|'分隔替代品,括号用于分组子模式。对于某些正则表达式引擎,括号和'\'符号需要通过前面的'\'字符进行转义才能具有这些特殊含义,而不是代表它们自己。

更具特色的正则表达式语言可以大大简化它;例如:

"^~[a-z]{2}[0-9,]{6}(?<=[a-z][0-9]*,[0-9]*)[A-HJ-M]$"

量词“{2}”和“{6}”表示前面的子模式必须完全匹配指定的次数(而不是一次),而量词“*”表示前面的子模式可以匹配任何数字次数,包括零。另外,“(?&lt; = ...)”是一个零长度的后视断言,它测试输入的先前字符是否与给定的子模式匹配(除了已经匹配前面的子模式)图案);字符也必须匹配后续的子模式(它会消耗它们)。 '。'几乎所有正则表达式语言都支持元字符和'*'量词,但断言和大括号量词的支持较少。然而,Java和Perl的正则表达式语言都将理解这种模式。

答案 2 :(得分:1)

您需要使用基于前瞻性的正面正则表达式,如下所示。

 System.out.println("~ak4,0000D".matches("~[a-z]{2}(?=\\d*,\\d*.$)[\\d,]{6}[A-HJ-M]"));
 System.out.println("~fk,10000D".matches("~[a-z]{2}(?=\\d*,\\d*.$)[\\d,]{6}[A-HJ-M]"));
 System.out.println("~jk400,00D".matches("~[a-z]{2}(?=\\d*,\\d*.$)[\\d,]{6}[A-HJ-M]"));
 System.out.println("~ak4,0000D".matches("~[a-z]{2}(?=\\d*,\\d*.$)[\\d,]{6}[A-HJ-M]"));
 System.out.println("~fk10000,D".matches("~[a-z]{2}(?=\\d*,\\d*.$)[\\d,]{6}[A-HJ-M]"));
 System.out.println("~jk400,00I".matches("~[a-z]{2}(?=\\d*,\\d*.$)[\\d,]{6}[A-HJ-M]"));
 System.out.println("~ak40000,Z".matches("~[a-z]{2}(?=\\d*,\\d*.$)[\\d,]{6}[A-HJ-M]"));
 System.out.println("~fky,10000D".matches("~[a-z]{2}(?=\\d*,\\d*.$)[\\d,]{6}[A-HJ-M]"));
 System.out.println("~,jk40000D".matches("~[a-z]{2}(?=\\d*,\\d*.$)[\\d,]{6}[A-HJ-M]"));

输出:

true
true
true
true
true
false
false
false
false

答案 3 :(得分:0)

~[a-z]{2}[\d|\,]{6}[A-M]

虽然我不是正则表达式的专业人士,但我每次都使用这个网站来构建我的模式:

RegExr

在您的代码中使用它:

Pattern pattern = Pattern.compile(yourPatternAsAString);
Matcher matcher = pattern.matcher(yourInputToMatch);
if(matcher.matches()) {
    // gogogo
}