RegEx:在“标题”数据库字段中匹配Mr. Ms.等

问题描述 投票:2回答:4

我需要构建一个RegEx表达式,它从我的数据库的Title字段中获取其文本字符串。即被搜索的完整字符串是:Mr.Ms.Dr.Sr.等。

不幸的是,这个字段是一个自由字段,任何东西都可以写入其中。例如:M.; A; CFO

除了以下所有内容之外,表达式需要匹配:Mr.; Ms.; Dr.; Sr.(注意:列表有点长,但为了简单起见,我保持简短。)

我到底做了什么:

这就是我在另一个领域成功使用的内容:

^(?!(VIP)$).*(这将匹配除“VIP”之外的所有字符串)

我重写了这个表达式,如下所示:

^(?!(Mr.|Ms.|Dr.|Sr.)$).*

不幸的是,这不起作用。我认为这是因为“。” (点)是RegEx中的保留符号,需要特殊处理。

我也尝试过:

^(?!(Mr\.|Ms\.|Dr\.|Sr\.)$).*

但也没有运气。

我在论坛中环顾四周并测试了一些其他解决方案,但找不到任何对我有用的解决方案。

我想知道我如何构建我的公式来搜索完整的(短)字符串并匹配除“先生”之外的所有内容等任何帮助表示赞赏!

注意:我的问题可能看似不寻常,似乎有许多开放的结果和可能的错误。然而,我的其余应用程序正在处理这些开放式目标。请相信我。

regex
4个回答
2
投票

如果您希望您的字符串只是不以其中一个前缀开头,那么执行以下操作:

^(?!([MDS]r|Ms)\.).*$

以上只是确保字符串的开头(^)后面没有一个列出的前缀。 (你甚至不需要.*$,但这是因为你正在使用一些需要完全匹配的引擎。)

如果您希望您的字符串在任何地方都没有这些前缀,那么执行:

^(.(?!([MDS]r|Ms)\.))*$

以上内容确保每个字符(.)都没有跟随您列出的前缀之一到最后(因此$在此中是必需的)。


我刚刚读到你的前缀列表可能会更长,所以让我扩展为你添加:

^(.(?!(Mr|Ms|Dr|Sr)\.))*$

你完全说出前缀?然后就这样做:

^(?!Mr|Ms|Dr|Sr)\.$

如果你想让点有条件:

^(?!Mr|Ms|Dr|Sr)\.?$
                  ^

0
投票

这可能会这样做

/(?!.*?(?:^|\W)(?:(?:Dr|Mr|Mrs|Ms|Sr|Jr)\.?|Miss|Phd|\+|&)(?:\W|$))^.*$/i

从我提到的那个页面


0
投票

而不是试图构建一个匹配除Mr.Ms.等之外的任何正则表达式,它会更容易(如果你的应用程序允许)编写只匹配那些字符串的正则表达式:

/^(Mr|Ms|Dr|Sr)\.$/

并且只需交换处理匹配和非匹配字符串的逻辑。


0
投票

通过这个|,我们可以定义任何我们将与字符串匹配的数字前缀模式。

var pattern = /^(Mrs.|Mr.|Ms.|Dr.|Er.).?[A-z]$/;
var str = "Mrs.Panchal";
console.log(str.match(pattern));
© www.soinside.com 2019 - 2024. All rights reserved.