ルールについて
a==b&c>=d|e<=f&!x==y
&、|、&!を使用してルールを分割したい 演算子andtも演算子を保存したい。
だから私は保存したい:
a==b
&
c>=d
|
e<=f
&!
x==y
また、これを文字列配列に格納する必要がありますか?
ありがとう。
ルールについて
a==b&c>=d|e<=f&!x==y
&、|、&!を使用してルールを分割したい 演算子andtも演算子を保存したい。
だから私は保存したい:
a==b
&
c>=d
|
e<=f
&!
x==y
また、これを文字列配列に格納する必要がありますか?
ありがとう。
この方法を試してください
String data = "a==b&c>=d|e<=f&!x==y";
Pattern p = Pattern.compile(
"&!"+ // &!
"|" + // OR
"&" + // &
"|" + // OR
"\\|" // since | in regex is OR we need to use to backslashes
// before it -> \\| to turn off its special meaning
);
StringBuffer sb = new StringBuffer();
Matcher m = p.matcher(data);
while(m.find()){
m.appendReplacement(sb, "\n"+m.group()+"\n");
}
m.appendTail(sb);
System.out.println(sb);
出力
a==b
&
c>=d
|
e<=f
&!
x==y
この正規表現はあなたが望むことをします。
final String input = "a==b&c>=d|e<=f&!x==y";
//this regex will yield pairs of one string followed by operator (&, | or &!)...
final String mainRegex = "(.*?)(&!|&|\\|)";
final Matcher matcher = Pattern.compile(mainRegex).matcher(input);
while (matcher.find()) {
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));
}
//...so we will need another regex to fetch what comes after the last operator
final String lastOne = "(.*)(&|\\||!)(.*)";
final Matcher lastOneMatcher = Pattern.compile(lastOne).matcher(input);
if (lastOneMatcher.find()) {
System.out.println(lastOneMatcher.group(3));
}
結果:
a==b
&
c>=d
|
e<=f
&!
x==y
ワンライナーで実現可能ですが、先読みと後読みの両方を使用したかなり複雑な正規表現が必要になります。
str.split("(?<=&!?|\\|)|(?=&!?|\\|)");
では、この正規表現は何をするのでしょうか?
正規表現&!?|\|
は、ルールに従って、有効な演算子を定義します。基本的には、「および-signの後に-sign、または-sign&
が続く」と読み上げられます。!
|
他の部分は、いわゆる「ゼロ幅アサーション」と呼ばれる正規表現構造の先読みと後読みです。
(?=a)
先読みし、次の文字が「a」であることを確認する先読みです。たとえば、「foobar」の「b」と「a」の間で開始および終了する長さがゼロの文字列と一致します。
したがって、与えられた正規表現の引数を使用して、私が提案した分割メソッド呼び出しは基本的に次のようになります。
&
、、&!
または|
記号の直前または直後にある入力文字列のすべての位置で分割します。