需要帮助才能找到匹配

时间:2015-10-06 12:58:59

标签: javascript regex

我的RegEx不按照我想的方式工作,它应该。

[^a-zA-Z](\d+-)?OSM\d*(?![a-zA-Z])

我将在javascript中使用此正则表达式,以检查字符串是否与其匹配。

Should match:
12345612-OSM34
12-OSM34
OSM56
7-OSM
OSM

Should not match:
-OSM
a-OSM
rOSMann
rOSMa
asdrOSMa
rOSM89
01-OSMann
OSMond
23OSM
45OSM678

一行代表我的javascript中的字符串。

https://www.regex101.com/r/xQ0zG1/3

匹配规则:

  • 匹配OSM如果它独立
  • 如果行以数字/ s开头并且后跟-
  • ,则可选匹配
  • 如果行以digit / s结尾,则为可选匹配
  • 匹配以上所有3个合并
  • 如果行以除OSM
  • 之外的字符/单词开头,则不匹配
  • 如果行结尾除了OSM
  • 之外的字符/字,则不匹配

我希望有人可以提供帮助。

2 个答案:

答案 0 :(得分:4)

您可以使用锚点使用以下简化模式:

^(?:\d+-)?OSM\d*$

所需的标记(如果匹配多行段落)将是:g用于全局匹配,m用于多行匹配,以便^$匹配每行的开头/结尾。

修改

(\d+-)匹配更改为(?:\d+-),以便它不会分组。

答案 1 :(得分:1)

[^a-zA-Z](\d+-)?OSM\d*(?![a-zA-Z])
  • [^a-zA-Z]在正则表达式中,您可以指定所需内容,而不是您不想要的内容。这段代码说必须一个字符,不是一个字母。我相信你想说的是匹配一条线的开头。你不需要指明那里没有字母,你还要指定那条线路上的内容。正则表达式的开头用^表示(括号外)。您必须使用m标志来制作正则表达式多行。

  • (\d+-)?表示一个或多个数字,后跟-个字符。 ?表示不需要整个块。如果您不想要外国数字,则可能需要使用[0-9],但它并不重要。这部分代码,你说得对。但是,如果您不需要捕获块,则可以写(?:)而不是()

  • \d*(?![a-zA-Z])使用预测,但您几乎不需要这样做。再一次,指定你不想要的东西是一个坏主意,因为那时我可以写OSMé并且它会匹配,因为你没有指定é是被禁止的。指定允许的内容要简单得多。在你的情况下,因为你想匹配行结束。因此,您可以写\d*$,这意味着零或更多数字,然后是行尾。

/^(?:\d+-)?OSM\d*$/gm是最终结果。

相关问题