2

このパターンを使用して、パーサーで一重引用符で囲まれた文字列を照合していました。

"'.+?'"

しかし、シングルクォートのエスケープ(シングルクォートの2倍)のようなpostgresでシングルクォートされた文字列を見つけることができる正規表現が必要です。次のように一致させる必要があります。

"'first', 'sec''ond', 't''hi''rd'"

一重引用符で始まり、一重引用符で終わる文字列の最短一致を見つけたいので、上記の文字列は 3 つの部分文字列を意味します。

'first'
'sec''ond'
't''hi''rd'
4

3 に答える 3

5

確かに、'(?:[^']|'')*'これは有効な正規表現です。これは、 a の'後に 0 個以上の文字以外の文字が続く場合、'または double 's の後に末尾の が続く場合に一致します'

ただし、より効率的にするために、ループ展開手法を使用して展開できます

'[^']*(?:''[^']*)*'

正規表現のデモを見て、正規表現がすべての一致を見つけるのに必要なステップ数に注意してください。

正規表現は次のように読むことができます

  • '- 抹茶'
  • [^']*- 次に、0 個以上の文字以外'
  • (?:''[^']*)*- 0 個以上のシーケンスの''後に 0 個以上の文字以外の文字が続く'
  • '- そして、末尾の'.

この正規表現には、可能な限りバックトラッキングを伴わない線形パターンがあります。

注意:後続の.,'

'.+?'(?=,|$)
     ^^^^^^^

正規表現のデモを参照してください。ただし、コンテキストに依存し、展開された正規表現よりも効率的ではありません。

于 2016-03-01T12:28:54.850 に答える
1

あなたが提供したパターンの場合、これはうまくいくはずです:

'[\w']+'

これは、一重引用符の後に 1 つ以上の非空白文字が続くか、一重引用符の後に最後の一重引用符が続く一致です。

于 2016-03-01T12:24:44.667 に答える