我试图比较是使用正则表达式在字符串列表中存在一个字符串。
我尝试使用以下内容......
(?!MyDisk1$|MyDisk2$)
但这对于像
这样的场景来说并不起作用(?!My disk1$|My Disk2$)
你能否建议一个更好的方法来应对这种情况..
我从sql查询中获取字符串列表...所以我不确定空格在哪里。字符串列表有所不同,如My Disk1,MyDisk2,My_Disk3,ABCD123,XYZ_123,MNP 123等....或任何其他字符串[a-zA-Z0-9_]
答案 0 :(得分:1)
您可以使用零或一个量词(?
)使空格可选:
(?!My ?disk1$|My ?Disk2$)
此断言将拒绝MyDisk2
或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$)
但说实话,在此之前,在尝试使用正则表达式之前,最好先对数据进行预处理。
答案 1 :(得分:0)
你可以这样做:
/(?[^\s_-]+(\s|_|-)?[^\s_-]*?$)/i
''量词表示前述模式的0或1。 / i是不区分大小写的。分隔符可以是空格或下划线或破折号。我用长度为1或更多的字符串替换My和disk,它不包含空格,下划线或破折号。现在它将匹配" Shikhar Subedi" " dprpradeep"或者" MyDisk 54"。
+量词表示1或更多。 ^表示不。 *表示0或更多。所以空格后的字符串是可选的。
答案 2 :(得分:0)
最后使用此Regex
upending i意味着您的regex
不区分大小写
/my\s?disk[12]\$/i
这将符合所有可能的情况。