3

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

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

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

到目前为止我尝试过的:

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

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

我重写了这个表达式,看起来像这样:

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

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

我也试过:

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

但也没有运气。

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

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

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

4

5 回答 5

3

如果您只想让您的字符串不以这些前缀之一开头,请执行以下操作:

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

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

如果您希望您的字符串在任何地方都没有这些前缀,请执行以下操作:

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

以上确保每个字符 ( .)后面都不跟您列出的前缀之一,直到最后(因此在这个前缀中$ 必要的)。


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

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

你说的完全是前缀?然后这样做:

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

如果你想让点有条件:

^(?!Mr|Ms|Dr|Sr)\.?$
                  ^
于 2013-10-07T05:01:14.217 回答
2

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

var pattern = /^(Mrs.|Mr.|Ms.|Dr.|Er.).?[A-z]$/;
var str = "Mrs.Panchal";
console.log(str.match(pattern));
于 2017-12-18T07:12:00.647 回答
0

与其尝试构造一个匹配 Mr.,Ms.等之外的任何内容的正则表达式,不如编写一个匹配这些字符串的正则表达式(如果您的应用程序允许):

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

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

于 2013-10-08T04:59:30.580 回答
0

这可以做到

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

从我提到的那个页面

于 2013-10-07T05:06:23.277 回答
0
re.sub(r'^([MmDdSs][RSrs]{1,2}|[Mm]iss)\.{0,1} ','',name)
于 2019-10-07T19:22:43.880 回答