-1

我无法找出我正在寻找的正确正则表达式。基本上我需要的是以下内容。

如果用户搜索诸如 NWES 之类的街道前缀并包含正则表达式忽略它的通配符 (%,*)。我只希望正则表达式专门与 NWES 一起使用。

那么我该如何编写正则表达式来表示,如果您旁边有一个角色,那么请忽略。这就是我到目前为止所拥有的。

^(N|S|W|E)\b

但它正在接收 N% 和其他通配符......我也不想要它。

4

3 回答 3

1

描述

此正则表达式将仅匹配带有 N、S、E、W 后跟空格和更多文本或行尾的街道。

^([nsew])\b(?:\s.*?)?$

在此处输入图像描述

  • 第 0 组将收到整个匹配值
  • 第 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
        )

)
于 2013-05-30T05:14:40.387 回答
0

^在那种情况下是字符串的开头而不是“not”。您可以使用负前瞻来做到这一点。

[NSWE](?!%|\*)
于 2013-05-29T23:15:46.183 回答
0

从您的问题来看,听起来您允许用户输入搜索表达式。然后,您尝试通过将搜索词直接传递到正则表达式函数来对其进行操作。

如果用户输入N%期望查找N后跟%任意数量的字符,但正则表达式引擎只是查看%字符并尝试匹配它。%在将用户提供的搜索词用作正则表达式之前,您可以通过将其替换为以下内容之一来更正用户提供的搜索词:

  • .*贪婪匹配行上所有剩余的字符
  • .*?非贪婪匹配任意数量的字符
  • .匹配任何单个字符

如果用户输入*.

免责声明:取决于正则表达式函数中使用的选项,.可能会或可能不会匹配新行。根据您的用户群,最好简单地告诉用户搜索词需要遵守正则表达式语法。这将允许知识渊博的用户构建自己的深奥表达。

于 2013-05-30T17:18:17.963 回答