2

このような形式の文字列があります。先頭にない文字列にマッチさせたいabcd

abcd.efgh.ijkl
pqrs.efgh.ijkl
xyz.efgh.ijkl

私はこの表現を思いついた(?<!abcd).efgh.ijkl http://rubular.com/r/jyZMIJxoNz

それはちょっと私が必要とすることをします。andの.efgh.ijkl部分に一致し、を無視します。しかし、私はまた、との部分を一致させたい.pqrs.efgh.ijklxyz.efgh.ijklabcd.efgh.ijklpqrsxyz

このような条件を作成しようとしました(?(?<!abcd)|.*\.efgh.ijkl)が、正規表現として認識されていません。構文の何が問題になっていますか? 「abcd で始まる場合、それblank以外の場合は までのすべてに一致し.efgh.ijklますか?

4

5 に答える 5

2
[^\s]*(?<!abcd).efgh.ijkl

http://rubular.com/r/h11pUhuYSD

あなたの目的のために働くはずです。ターゲットがより長い文字列にある場合でも一致します。

于 2012-04-24T12:33:13.827 に答える
1

これには、後読みではなく先読みを使用します。

^(?!abcd\.)[a-z]+(?:\.[a-z]+)+$

主な正規表現は^[a-z]+(?:\.[a-z]+)+$で、ドットで区切られた 2 つ以上の文字の塊で構成される文字列に一致します。開始アンカーの直後の先読みにより、最初のクランプが ではないことが保証されabcdます。

実際に Ruby でこれを行っている場合は、行アンカーであることに注意^$ください。これは、正規表現が文字列から 2 行目を抜き取ることを意味します。

foo
pqrs.efgh.ijkl
bar

...それはあなたが望むものではないかもしれません。Ruby で文字列全体のみを一致させるには、文字列アンカーを使用する必要があり\Aます\z

\A(?!abcd\.)[a-z]+(?:\.[a-z]+)+\z

条件を使用しようとしているのですが、Ruby はそれらをサポートしていないようです。とにかく、それはうまくいかなかったでしょう。

于 2012-04-24T16:12:17.187 に答える
0

否定後読みは楽しいものであり、使用するのに適したツールです。

しかし、で始まらない行全体だけを一致させたい場合abcd、これを行う簡単な方法は、 で始まる行を一致させてから、一致しないabcdすべての行を取ることです。

例 (python):

In [1]: lines = [
   ...: "abcd 1",
   ...: "abcd 2",
   ...: "pqrs 3",
   ...: "pqrs 4" ]

In [2]: import re

In [4]: for line in lines:
   ...:     if re.match(r"^abcd.+$", line):
   ...:         pass # do nothing
   ...:     else:
   ...:         print (line)
   ...: 

pqrs 3
pqrs 4

さらに、abcd探している がリテラル文字列 (つまり、文字通りabcdであり、他の正規表現ではない) である場合、文字列操作はより高速で理解しやすくなります。

In [5]: for line in lines:
   ...:     if not(line.startswith('abcd')):
   ...:         print(line)
   ...: 

pqrs 3
pqrs 4
于 2012-04-24T11:03:49.040 に答える
0

これを試して:

(?m)^(?!abcd).+$

説明:

<!--
(?m)^(?!abcd).+$

Options: ^ and $ match at line breaks

Match the remainder of the regex with the options: ^ and $ match at line breaks (m) «(?m)»
Assert position at the beginning of a line (at beginning of the string or after a line break character) «^»
Assert that it is impossible to match the regex below starting at this position (negative lookahead) «(?!abcd)»
   Match the characters “abcd” literally «abcd»
Match any single character that is not a line break character «.+»
   Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
Assert position at the end of a line (at the end of the string or before a line break character) «$»
-->
于 2012-04-24T10:21:20.460 に答える
0

これを試してください:

[^"(a.+b)|(b.+c)|(c.+d)|"].* 

http://rubular.com/r/51OShSXwUz

于 2012-04-24T10:39:33.747 に答える