我无法找出我正在寻找的正确正则表达式。基本上我需要的是以下内容。
如果用户搜索诸如 NWES 之类的街道前缀并包含正则表达式忽略它的通配符 (%,*)。我只希望正则表达式专门与 NWES 一起使用。
那么我该如何编写正则表达式来表示,如果您旁边有一个角色,那么请忽略。这就是我到目前为止所拥有的。
^(N|S|W|E)\b
但它正在接收 N% 和其他通配符......我也不想要它。
我无法找出我正在寻找的正确正则表达式。基本上我需要的是以下内容。
如果用户搜索诸如 NWES 之类的街道前缀并包含正则表达式忽略它的通配符 (%,*)。我只希望正则表达式专门与 NWES 一起使用。
那么我该如何编写正则表达式来表示,如果您旁边有一个角色,那么请忽略。这就是我到目前为止所拥有的。
^(N|S|W|E)\b
但它正在接收 N% 和其他通配符......我也不想要它。
此正则表达式将仅匹配带有 N、S、E、W 后跟空格和更多文本或行尾的街道。
^([nsew])\b(?:\s.*?)?$
第 1 组将只收到 N、S、E 或 W
N Wisconsin Drive S Voter Booth E Kitten Ave W Washington Street Noghtington Lane Silver Stone Drive Edans Expressway Wireware Waythrough
您没有指定语言,所以我选择 PHP 来演示正则表达式。
<?php
$sourcestring="N Wisconsin Drive
S Voter Booth
E Kitten Ave
W Washington Street
Noghtington Lane
Silver Stone Drive
Edans Expressway
Wireware Waythrough";
Dim re As Regex = New Regex("^([nsew])\b(?:\s.*?)?$",RegexOptions.IgnoreCase OR RegexOptions.Multiline)
Dim mc as MatchCollection = re.Matches(sourcestring)
Dim mIdx as Integer = 0
For each m as Match in mc
For groupIdx As Integer = 0 To m.Groups.Count - 1
Console.WriteLine("[{0}][{1}] = {2}", mIdx, re.GetGroupNames(groupIdx), m.Groups(groupIdx).Value)
Next
mIdx=mIdx+1
Next
End Sub
End Module
$matches Array:
(
[0] => Array
(
[0] => N Wisconsin Drive
[1] => S Voter Booth
[2] => E Kitten Ave
[3] => W Washington Street
)
[1] => Array
(
[0] => N
[1] => S
[2] => E
[3] => W
)
)
^
在那种情况下是字符串的开头而不是“not”。您可以使用负前瞻来做到这一点。
[NSWE](?!%|\*)
从您的问题来看,听起来您允许用户输入搜索表达式。然后,您尝试通过将搜索词直接传递到正则表达式函数来对其进行操作。
如果用户输入N%
期望查找N
后跟%
任意数量的字符,但正则表达式引擎只是查看%
字符并尝试匹配它。%
在将用户提供的搜索词用作正则表达式之前,您可以通过将其替换为以下内容之一来更正用户提供的搜索词:
.*
贪婪匹配行上所有剩余的字符.*?
非贪婪匹配任意数量的字符.
匹配任何单个字符如果用户输入*
.
免责声明:取决于正则表达式函数中使用的选项,.
可能会或可能不会匹配新行。根据您的用户群,最好简单地告诉用户搜索词需要遵守正则表达式语法。这将允许知识渊博的用户构建自己的深奥表达。