2

次の正規表現を持つ:

([a-z])([0-9])\1

に一致しますが、、などa5aにも一致する方法はありますか?a5ba5ca5d


編集:わかりました、使用できることは理解しています([a-z])([0-9])([a-z])が、非常に長くて複雑な正規表現 ( sub-sub-sub-...-domains に一致するか、IPv4 アドレスに一致する) は、上記の動作から本当に恩恵を受けます。 . 後方参照などでそれを達成することは何とか可能ですか?


アノン。答えは私が必要とするものですが、間違っているようです。

4

6 に答える 6

3

答えは後方参照ではありません

後方参照とは、以前に一致した値に一致することを意味します。前の式に一致するという意味ではありません。ただし、言語で許可されている場合は、コンパイルする前に、文字列内の変数を式に置き換えることができます。

Tcl:

set exp1 "([a-z])"
regexp "${exp1}([0-9])${exp1}+" $string

Javascript:

var exp1 = '([a-z])';
var regexp = new RegExp(exp1 + '([0-9])' + exp1 + '+');
string.match(regexp);

パール:

my $exp1 = '([a-z])';
$string =~ /${exp1}([0-9])${exp1}+/;
于 2010-01-14T02:20:03.727 に答える
2

正規表現での後方参照の要点は、指定された部分表現と同じものに一致することなので、その動作を無効にする方法はありません。

後で正規表現の一部を再利用できるようにするために、再利用したい正規表現の部分を別の文字列で定義するだけで、必要な動作を得ることができます。 ) 文字列補間または連結を使用して、断片から正規表現を構築します。

たとえば、Ruby では次のようになります。

>> letter = '([a-z])'
=> "([a-z])"
>> /#{letter}([0-9])#{letter}+/ =~ "a5b"
=> 0
>> /#{letter}([0-9])#{letter}+/ =~ "a51"
=> nil

または JavaScript で:

var letter = '([a-z])';
var re = new RegExp(letter + '([0-9])' + letter + '+');
"a5b".match(re)
于 2010-01-14T02:09:47.723 に答える
2

2 番目の文字が最初の文字から独立している場合、後方参照は必要ありませんよね?

([a-z])([0-9])([a-z])+

編集

最後の部分を何度も繰り返したくない場合は、次のようにします。

([a-z])([0-9])([a-z])

「+」を取り除くだけです。

于 2010-01-14T01:58:47.483 に答える
1

あなたは Perl(?PARNO)構造に似たものを望んでいると思います (再帰のためだけではありません;)。

/([a-z])([0-9])(?1)+/

必要なものと一致します-最初のキャプチャグループへの変更は、(?1)一致するものに反映されます。

于 2010-01-14T02:10:08.100 に答える
0

後方参照は、正規表現の前の方からデータを取得し、後で使用するためのものです。文体の問題を修正するためのものではありません。後方参照のある正規表現は、ないものとして機能しません。反復的で醜い正規表現に慣れる必要があるかもしれません。

小さなブロックから簡単に正規表現を構築できる Python を試してみてください。環境の変更が許可されているかどうかは不明です…そもそも後方参照があるのは幸運です。

于 2010-01-14T02:29:35.143 に答える
0

私はあなたの質問に従いませんか?

[a-z][0-9][a-z] Exactly 1
[a-z][0-9][a-z]? One or 0
[a-z][0-9][a-z]+ 1 or more
[a-z][0-9][a-z]* 0 or more
于 2010-01-14T02:00:10.717 に答える