我需要构建一个RegEx表达式,它从我的数据库的Title字段中获取其文本字符串。即被搜索的完整字符串是:Mr.
或Ms.
或Dr.
或Sr.
等。
不幸的是,这个字段是一个自由字段,任何东西都可以写入其中。例如:M.
; A
; CFO
等
除了以下所有内容之外,表达式需要匹配:Mr.
; Ms.
; Dr.
; Sr.
(注意:列表有点长,但为了简单起见,我保持简短。)
我到底做了什么:
这就是我在另一个领域成功使用的内容:
^(?!(VIP)$).*
(这将匹配除“VIP”之外的所有字符串)
我重写了这个表达式,如下所示:
^(?!(Mr.|Ms.|Dr.|Sr.)$).*
不幸的是,这不起作用。我认为这是因为“。” (点)是RegEx中的保留符号,需要特殊处理。
我也尝试过:
^(?!(Mr\.|Ms\.|Dr\.|Sr\.)$).*
但也没有运气。
我在论坛中环顾四周并测试了一些其他解决方案,但找不到任何对我有用的解决方案。
我想知道我如何构建我的公式来搜索完整的(短)字符串并匹配除“先生”之外的所有内容等任何帮助表示赞赏!
注意:我的问题可能看似不寻常,似乎有许多开放的结果和可能的错误。然而,我的其余应用程序正在处理这些开放式目标。请相信我。
如果您希望您的字符串只是不以其中一个前缀开头,那么执行以下操作:
^(?!([MDS]r|Ms)\.).*$
以上只是确保字符串的开头(^
)后面没有一个列出的前缀。 (你甚至不需要.*$
,但这是因为你正在使用一些需要完全匹配的引擎。)
如果您希望您的字符串在任何地方都没有这些前缀,那么执行:
^(.(?!([MDS]r|Ms)\.))*$
以上内容确保每个字符(.
)都没有跟随您列出的前缀之一到最后(因此$
在此中是必需的)。
我刚刚读到你的前缀列表可能会更长,所以让我扩展为你添加:
^(.(?!(Mr|Ms|Dr|Sr)\.))*$
你完全说出前缀?然后就这样做:
^(?!Mr|Ms|Dr|Sr)\.$
如果你想让点有条件:
^(?!Mr|Ms|Dr|Sr)\.?$
^
这可能会这样做
/(?!.*?(?:^|\W)(?:(?:Dr|Mr|Mrs|Ms|Sr|Jr)\.?|Miss|Phd|\+|&)(?:\W|$))^.*$/i
从我提到的那个页面
而不是试图构建一个匹配除Mr.
,Ms.
等之外的任何正则表达式,它会更容易(如果你的应用程序允许)编写只匹配那些字符串的正则表达式:
/^(Mr|Ms|Dr|Sr)\.$/
并且只需交换处理匹配和非匹配字符串的逻辑。
通过这个|
,我们可以定义任何我们将与字符串匹配的数字前缀模式。
var pattern = /^(Mrs.|Mr.|Ms.|Dr.|Er.).?[A-z]$/;
var str = "Mrs.Panchal";
console.log(str.match(pattern));