文字列をフィルタリングするために正規表現を使用する必要があります。文字列には少なくとも 1 つのドットが含まれ、限定された文字セットで囲まれます。
だから私は使用しました(すべてのスペースを無視しました):
^[a-z0-9:_-]+ \. [a-z0-9:_-]+$
問題は、まったく同じ正規表現[a-z0-9:_-]+
を 2 回使用する必要があることです。より良いものを書く方法はありますか?
文字列をフィルタリングするために正規表現を使用する必要があります。文字列には少なくとも 1 つのドットが含まれ、限定された文字セットで囲まれます。
だから私は使用しました(すべてのスペースを無視しました):
^[a-z0-9:_-]+ \. [a-z0-9:_-]+$
問題は、まったく同じ正規表現[a-z0-9:_-]+
を 2 回使用する必要があることです。より良いものを書く方法はありますか?
いいえ、固定小数点の前後で文字セットの正規表現を明示的に繰り返す必要があります。
大文字と小文字が問題にならない場合は、使用している言語によっては、おそらくこれでうまくいく可能性があります
^[\w:-]+ \. [\w:-]+$
\w
マッチ[A-Za-z0-9_]
別の方法は、文字列から RegExp を構築することです。JavaScript の例を次に示します。
var chars = '[\\w:-]';
var re = new RegExp('^' + chars + ' \\. ' + chars + '$');
re;
// => /^[\w:-] \. [\w:-]$/
この不自然な例ではあまり節約できませんが、正規表現がどれほど複雑になるかによっては、文字クラスを複製する必要がなくなる可能性があります。\\
また、文字列で正規表現を作成するときは、スラッシュをエスケープすることを忘れないでください。
私がパーサーか何かを書いていたら、上記の例をさらに一歩進めて、次のようにするでしょう:
RegExp.build = function(regexen, flags) {
return new RegExp(regexen.map(function(re) { return re.source }).join(''), flags);
};
var chars = /[\w:-]+/;
RegExp.build([/^/, chars, / \. /, chars, /$/], 'gi');
//=> /^[\w:-]+ \. [\w:-]+$/gi
lua がこの構文をサポートしているかどうかはわかりません (perl で動作するので、PCRE で動作する可能性があります):
^([a-z0-9:_-]+)\.(?1)$
(?1)
は、グループ 1 のキャプチャに使用されたものと同じパターンです (つまり、[a-z0-9:_-]+)。
一部の言語では、正規表現を変数に格納したり、文字列から構築したりできます。たとえば、Perl では次のことができます。
my $re_l = qr/[a-z0-9:_-]+/;
my $re = qr/^$re_l\.$re_l$/;
POSITIVE LOOKAHEAD
/^(?=.*[^.]\.[^.])[a-z0-9:_.-]+$/
- 非ドット文字で囲まれた
/^(?=^([^.]+\.)+[^.]+$)[a-z0-9:_.-]+$/
少なくとも 1 つのドット - 少なくとも 1 つのドットとすべてのドットが非ドット文字で囲まれている