我的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
如果它独立-
OSM
OSM
我希望有人可以提供帮助。
答案 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
是最终结果。