0

我试图比较一个字符串是否存在于使用正则表达式的字符串列表中。

我尝试使用以下...

(?!MyDisk1$|MyDisk2$)

但这不起作用......对于像这样的场景

(?!My disk1$|My Disk2$)

你能建议一种更好的方法来处理这种情况吗?

我从 sql 查询中获取字符串列表...所以我不确定空格在哪里。字符串列表各不相同,例如 My Disk1、MyDisk2、My_Disk3、ABCD123、XYZ_123、MNP 123 等......或任何其他带有 [a-zA-Z0-9_ ] 的字符串

4

3 回答 3

1

您可以使用零或一量词 ( ?) 使空格可选:

(?!My ?disk1$|My ?Disk2$)

此断言将拒绝像MyDisk2or之类的子字符串My Disk2。或者要处理可能的多个空格,请使用零个或多个量词 ( *):

(?!My *disk1$|My *Disk2$)

请注意,如果您在忽略模式中空格的引擎中运行它,您可能需要使用字符类,如下所示:

(?!My[ ]*disk1$|My[ ]*Disk2$)

或处理空格或下划线:

(?!My[ _]*disk1$|My[ _]*Disk2$)

不幸的是,如果空格可以在字符串中的任何位置,(但您仍然关心按顺序匹配其他字母),您必须执行以下操作:

(?! *M *y *d *i *s *k *1$| *M *y *D *i *s *k *2$)

或处理空格或下划线:

(?![ _]*M[ _]*y[ _]*d[ _]*i[ _]*s[ _]*k[ _]*1$|[ _]*M[ _]*y[ _]*D[ _]*i[ _]*s[ _]*k[ _]*2$)

但老实说,在这一点上,您最好先对数据进行预处理,然后再尝试使用正则表达式。

于 2013-09-12T06:02:44.110 回答
0

你可以这样做:

/(?[^\s_-]+(\s|_|-)?[^\s_-]*?$)/i

“?” 量词表示前面模式的 0 或 1。/i 不区分大小写。分隔符可以是空格或下划线或破折号。我已将 My 和 disk 替换为长度为 1 或更长且不包含空格、下划线或破折号的字符串。现在它将匹配“Shikhar Subedi”“dprpradeep”或“MyDisk 54 ”。

+ 量词表示 1 或更多。^ 表示没有。* 表示 0 或更多。所以空格后面的字符串是可选的。

于 2013-09-12T06:03:01.983 回答
0

最后使用这个Regex颠倒的 i 这意味着你regex不区分大小写

/my\s?disk[12]\$/i

这将匹配所有可能的情况。

于 2013-09-12T06:07:47.963 回答