コロンで区切られた入力文字列を取得したい。たとえば、a:int
. と[^:]*
を取得するために使用できます。a
int
ただし、 などのコロンを含む組み合わせで文字列を分割したくありませんA:=3:command
。私が欲しいのはA:=3
andですが、,ではありcommand
ません。A
=3
command
誰か正規表現の書き方を教えてくれませんか?
コロンで区切られた入力文字列を取得したい。たとえば、a:int
. と[^:]*
を取得するために使用できます。a
int
ただし、 などのコロンを含む組み合わせで文字列を分割したくありませんA:=3:command
。私が欲しいのはA:=3
andですが、,ではありcommand
ません。A
=3
command
誰か正規表現の書き方を教えてくれませんか?
OPによる編集が保留されている間、分割に表示される唯一のコロンは、単純なASCII文字または数字が続くコロンのみであると想定します。ソリューションは簡単に一般化できます。
JavaScript での具体的な例を次に示します。
s = "x:=3:comment"
s.split(/:(?=[\s\w])/)
結果は
['x:=3','comment']
分割機能は、「スペースまたは単語文字 (ASCII 文字、数字、またはアンダースコア) が後に続くコロンで分割する」と言います。
他の言語にはより強力な形式のルックアラウンド (特に否定的なルックアラウンド) がありますが、基本的な考え方は、特定のコンテキストで分割値がコロンである正規表現を構築することです。
補遺
もう一つの例:
"this:has:(some%: 7colons:$:6)".split(/:(?=[\s\w])/)
生成:
['this','has:(some%',' 7colons:$','6')]
一見すると、文字列の最後のコロンで分割したいので、末尾の素材をコロン以外の文字列にし、前の素材を何でもしたいと考えています。また、(私が質問に答えた時点で) 必要な正規表現の亜種 (どの言語で書いているか) も指定しなかったため、Perl で回答できます。
#!/usr/bin/env perl
use strict;
use warnings;
my @array = ( "a:int", "A:=3:comment" );
foreach my $item (@array)
{
my($prefix, $suffix) = $item =~ m/^(.*):([^:]+)$/;
print "$prefix and $suffix\n";
}
そのスクリプトからの出力は次のとおりです。
a and int
A:=3 and comment
明らかに、分割のルールが異なる場合 (単に「最後のコロン」ではない場合)、パターンを変更する必要があります。しかし、これは述べられた要件を合理的にきれいに達成します。
レイの答えに加えて、別のオプションは、たとえばサポートする演算子をホワイトリストに登録することです:=
(JavaScript の例)。
var s = "hello:world:=5:and:r";
var tokens = s.match(/(?:[^:]|:=)+/g);
たとえば、演算子:=
、=:
、:=:
および::
が必要な場合は、次のように記述できます。
/(?:[^:]|:=|=:|:=:|::)+/g
(これは単純化できますが、簡単に保守できると思います)。