-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

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 に答える
1

上記の Python ソリューションがその役割を果たします。しかし、偶然にも、このようなことを行う方法を学びたいと思った場合は、次の解決策が考えられます (JavaScript の場合。他の言語では構文が異なる場合があります)。

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

最後のiは、大文字と小文字を区別しません (テストされた文字列を事前に小文字に変換するのと同じです)。括弧内の単語の|間は、これらの 2 つの単語を交換できるようにします。just は、.*?括弧内のものと の間にほとんど何でもあり得ることを意味しますpresume

presumeこれは、括弧内のものの前にある必要があることを意味することに注意してください。正直なところ、順序が重要な場合は、正規表現で多くの苦痛を味わうことになります。

于 2013-08-17T21:31:41.237 に答える
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 に答える
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 に答える