-1

我想要一个不区分大小写的表达式,它可以在逻辑上找到:(stringA OR stringB) AND stringC。

因此,如果 stringA 是“dr” stringB 是“doctor”,而 stringC 是“presume”,我想要这些结果:

Dr. Livinsgston I presume           TRUE
Doctor Livingston I presume         TRUE
Mr. Livingston I presume            FALSE

值在测试字符串中的位置无关紧要,但如果我可以让表达式要求(A 或 B)在测试字符串中的 C 之前,那就更好了。

这对正则表达式可行吗?

4

4 回答 4

1

上面发布的 Python 解决方案可以完成这项工作;但是如果您也只是想学习如何做这样的事情,这里有一个可能的解决方案(在 JavaScript 中;语法在其他语言中可能会有所不同):

/(dr|doctor).*?presume/i.test(...);

最后i的 使其不区分大小写(相当于仅将测试的字符串预先转换为小写)。括号中的|单词之间使得这两个单词可以互换。.*?只是意味着括号中的内容和presume.

请注意,这意味着presume必须在括号中的内容之前。不过老实说,如果顺序很重要,那么您会为正则表达式带来很多痛苦。

于 2013-08-17T21:31:41.237 回答
1

在 Perl 中,你可以做类似..

(?:[Dd]r|Doctor).*(?:presume)

正则表达式:

(?:                        group, but do not capture:
  [Dd]                     any character of: 'D', 'd'
     r                     match 'r'
     |                     OR
     Doctor                match 'Doctor'
)                          end of grouping
 .*                        any character except \n (0 or more times)
  (?:                      group, but do not capture (1 or more times)
    presume                match 'presume'
  )                        end of grouping

断言的简短解释。请参阅正则表达式前瞻、后瞻和原子组

(?=)    Positive look ahead assertion
(?!)    Negative look ahead assertion
(?<=)   Positive look behind assertion
(?<!)   Negative look behind assertion
(?>)    Once-only subpatterns 
(?(x))  Conditional subpatterns
(?#)    Comment (?# Pattern does x y or z)
于 2013-08-17T22:22:29.017 回答
0

使用正则表达式非常可行,但在这种情况下绝对没有理由使用正则表达式。您没有添加语言,所以这里有一个简单的 python 解决方案:

def check_string(test_string):
    lowered_string = test_string.lower()
    doctor = lambda s: "dr" in s or "doctor" in s
    presume = lambda s: "presume" in s
    return doctor(lowered_string) and presume(lowered_string)

一般来说,您希望尽可能避免使用正则表达式,并且您可以通过对字符串的小写版本进行检查(就像我在上面所做的那样)轻松地使检查不区分大小写。

如果您想将它与正则表达式匹配,这里是 d'alar'cop 的答案的一个版本,它实际上有效(移至 python 以保持我的答案内部一致):

import re
return bool(re.match( r'(dr|doctor).*?presume',test_string.lower()))
于 2013-08-17T21:19:40.497 回答
0

是的,你可以用正则表达式做到这一点。使用 grep 你可以简单地做到这一点

echo Doctor Livinsgston I presume | grep "^\(Dr\.\|Doctor\).*presume$" >/dev/null; [[ $? == 0 ]] && echo TRUE || echo FALSE
TRUE
echo Dr. Livinsgston I presume | grep "^\(Dr\.\|Doctor\).*presume$" >/dev/null; [[ $? == 0 ]] && echo TRUE || echo FALSE
TRUE
echo Mr. Livinsgston I presume | grep "^\(Dr\.\|Doctor\).*presume$" >/dev/null; [[ $? == 0 ]] && echo TRUE || echo FALSE
FALSE
于 2013-08-17T21:29:58.223 回答