代码的正则表达式

时间:2011-05-16 19:03:48

标签: java regex

我很难找到一个可以匹配这些字符串的正则表达式:

@OSMHO:6:75
@4F0SO:5:56
@40KIR:5:15
@VDXBC:4:13
@WYRRA:6:59
@A4AUN:1118:803

你们可以看到这些字符串以“@”开头,后跟5个字母数字字符,然后是“:”,然后是数字,然后是另一个“:”,然后是另一个数字。 非常感谢你的帮助。

5 个答案:

答案 0 :(得分:3)

要匹配模式开头的@,请使用^(行首),然后使用@。因此,您的模式以^@开头。

字母数字表示来自a-z,A-Z和0-9的任何字母。如果要在正则表达式中表示“以下字符之一”,则语法是将字符集括在[]中。在这种情况下,它看起来像[a-zA-Z0-9]。要说你想要其中五个,你可以在这组字符后使用{5}。您的表达现在看起来像^@[a-zA-Z0-9]{5}

冒号只是冒号:。多位数表示您需要一个或多个数字。数字表示为[0-9](即:0到9之间的数字之一)。 “一个或多个”由+表示。因此,要添加冒号,一个或多个数字,冒号和一个或多个数字,您将添加:[0-9]+:[0-9]+。您的模式现在看起来像这样:^@[a-zA-Z0-9]{5}:[0-9]+:[0-9]+

您也可以使用简写\d来表示“数字”,因此您也可以编写^@[a-zA-Z0-9]{5}:\d+:\d+,虽然这可能很棘手,因为您可能需要额外的反斜杠,具体取决于您的引用类型用于定义该表达式。有时最简单的方法是避免使用反斜杠来使模式更容易理解的快捷方式,尤其是在您第一次学习如何使用正则表达式时。

如果要捕获组中匹配的每个部分,可以使用括号。例如,您可以^@([a-zA-Z0-9]{5}):([0-9]+):([0-9]+)@和第一个:之间的值放在一个组中,将两个冒号之间的值放在第二个组中,并将值放在第三组中的最后一个结肠。如果您只关心自己是否匹配,而不是想要匹配的每一条,您可以将括号括起来。

如果你按照我刚刚做的方式建立一个模式 - 一次处理一个 - 正则表达式可以很容易。

答案 1 :(得分:0)

/@[\d\w]{5}:\d+:\d+/

\ d是一个数字,\ w是一个字符。

答案 2 :(得分:0)

尝试

#@([a-zA-Z0-9]{5}):([0-9]+):([0-9]+)#i

答案 3 :(得分:0)

在python中尝试过这个:

>>> str = 'this is a test @WYRRA:6:59tyusd'
>>> match = re.search('\@[A-Z0-9]{5}\:[0-9]+\:[0-9]+',str)
>>> print match.group(0)
@WYRRA:6:59

所以,正则表达式是:

  • \ @ == @符号转义(不是真的需要转义)
  • [A-Z0-9] {5} ==完全出现任何大写字母或数字数字
  • \: ==:sign escaped
  • [0-9] + ==任意数字一次或多次

其他答案似乎正确。您可能会注意到每个答案中的正则表达式几乎没有差异,例如javascript中使用的开头和结尾'/'。

答案 4 :(得分:-1)

我只想在Java中使用以下正则表达式:

"^@[^:]*:[^:]*:[^:]*$"

而不是匹配数字或字母,我只是匹配,直到找到:

完整的Java代码:

p = Pattern.compile("^@(\\p{Alnum}+):(\\d+):(\\d+)$");
m = p.matcher("@40KIR:5:15");
while (m.find())
    System.out.println("Matched: " + m.group(1) + ',' + m.group(2)+ ',' + m.group(3));

输出

Matched: 40KIR,5,15