4

私は文字列を持っています:

最初の単語 単語2 単語3 間違った単語 単語4 最後の単語

FirstWordで始まり、で終わり、lastWordを含まない文字列を選択したいwrongWord

最初と最後に私が持っている:

/最初の単語 (.*?) 最後の単語/i

しかし、除外wrongwordは機能しませんでした。

試した:

/firstword (^wrongWord*?) lastword/i

/firstword ^((?!wrongWord).)* lastword/i

これに似ていますが、何も機能しません。

4

4 に答える 4

9

単に次の何が問題になっていますか?

/^firstword ((?:(?!wrongword).)+) lastword$/i

見るlive demo

正規表現:

^              the beginning of the string
 firstword     'firstword '
 (             group and capture to \1:
  (?:          group, but do not capture (1 or more times)
   (?!         look ahead to see if there is not:
    wrongword  'wrongword'
   )           end of look-ahead
   .           any character except \n
  )+           end of grouping
 )             end of \1
 lastword      ' lastword'
$              before an optional \n, and the end of the string
于 2013-11-14T14:27:18.913 に答える
1

禁止された単語がたまたま長い単語の一部である場合はどうなりますか? たとえば、「first」で始まり「last」で終わるが「word」という単語を含まない文字列が必要な場合はどうすればよいでしょうか。例えば:

"first one two word last"              # don't match
"first three wordplay four last"       # OK
"first five swordfish six seven last"  # OK

受け入れられた回答を適応させると、次のようになります。

/^first (?:(?!word).)+ last$/i

...しかし、それは 3 つの文字列すべてを拒否します。とにかく、すべての位置で先読みを実行する必要はありません。各単語の先頭で 1 回だけ実行します。

/^first(?:\s+(?!word\b)\w+)*\s+last$/i

ライブデモを見る

于 2013-11-14T16:21:25.233 に答える