FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【Java】『Dangling meta character』と『Unclosed group』と『Unmatched closing』エラー

必要ワードのみを抜き出したくて、
以下のような感じのコードを書きました。


import java.util.*;
import java.util.regex.*;

class WordJudge{
public static void main(String [] args){
WordJudge wj = new WordJudge();
wj.judge();
}

void judge(){
ArrayList<String> al = new ArrayList<String>();
al.add("konc");
al.add("+あいう");
al.add("(´・ω・`)");
al.add("tomo");
al.add("ad)");
al.add("*adf");
al.add("ike");

String s1 = "+あいう";
String s2 = "(´・ω・`)";

Matcher m1;
Matcher m2;
Pattern p1 = Pattern.compile(s1);
Pattern p2 = Pattern.compile(s2);

for(String s : al){
m1 = p1.matcher(s);
m2 = p2.matcher(s);

if(m1.matches()){
System.out.println(s);
}else if(m2.matches()){
System.out.println(s);
}else{

}
}
}
}


で、実行したところ
以下のようなExceptionが発生し、うまく動きませんでした。


Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '+' near index 0
+あいう
^
at java.util.regex.Pattern.error(Pattern.java:1650)
at java.util.regex.Pattern.sequence(Pattern.java:1787)
at java.util.regex.Pattern.expr(Pattern.java:1687)
at java.util.regex.Pattern.compile(Pattern.java:1397)
at java.util.regex.Pattern.<init>(Pattern.java:1124)
at java.util.regex.Pattern.compile(Pattern.java:817)
at WordJudge.judge(WordJudge.java:25)
at WordJudge.main(WordJudge.java:7)


『Dangling meta character '+'』と言っているんですが、
要はメタキャラクタ使ってるよって言っている感じなので、
バックスラッシュを以下のように入れて回避しました。

if(s1.indexOf("+") != -1){
s1 = s1.replaceAll("\\+","\\\\+");
}


そうすると、次に以下のようなエラーが出力されました。


Exception in thread "main" java.util.regex.PatternSyntaxException: Unclosed group near index 5
(ad\)
^
at java.util.regex.Pattern.error(Pattern.java:1650)
at java.util.regex.Pattern.accept(Pattern.java:1508)
at java.util.regex.Pattern.group0(Pattern.java:2460)
at java.util.regex.Pattern.sequence(Pattern.java:1715)
at java.util.regex.Pattern.expr(Pattern.java:1687)
at java.util.regex.Pattern.compile(Pattern.java:1397)
at java.util.regex.Pattern.<init>(Pattern.java:1124)
at java.util.regex.Pattern.compile(Pattern.java:817)
at WordJudge.judge(WordJudge.java:167)
at WordJudge.main(WordJudge.java:140)


『Unclosed group』って何???みたいな感じでしたが、
冷静になって直訳してみると『開いているグループ』となる為、
"(" ← こいつがいけないんだと思い、以下を追加


if(s2.indexOf("(") != -1){
s2 = s2.replaceAll("\\(","\\\\(");
}


で、さらに以下のエラーが出力されました。


Exception in thread "main" java.util.regex.PatternSyntaxException: Unmatched closing ')' near index 1
ad)
^
at java.util.regex.Pattern.error(Pattern.java:1650)
at java.util.regex.Pattern.compile(Pattern.java:1401)
at java.util.regex.Pattern.<init>(Pattern.java:1124)
at java.util.regex.Pattern.compile(Pattern.java:817)
at WordJudge.judge(WordJudge.java:170)
at WordJudge.main(WordJudge.java:140)


『Unmatched closing ')'』とでているので、これもダメと。。。
なので、以下を挿入。
※これは、英語がわからなくても何となくわかるエラーですね。。。


if(s2.indexOf(")") != -1){
s2 = s2.replaceAll("\\)","\\\\)");
}


上記を追加して、やっと以下の結果が出力しました。

+あいう
(ad)


<迷走した部分>
『Unclosed group』と出力されたExceptionの意味が、なかなか理解できずに小一時間。。。
^の記述されている部分が")"の部分に近かったので、こいつが悪いのかとか、
色々騙され続けて(勝手に騙されていた訳なんですが。。。)迷走していました。

<最終的なコード>

import java.util.*;
import java.util.regex.*;

class WordJudge{
public static void main(String [] args){
WordJudge wj = new WordJudge();
wj.judge();
}

void judge(){
ArrayList<String> al = new ArrayList<String>();
al.add("konc");
al.add("+あいう");
al.add("(´・ω・`)");
al.add("tomo");
al.add("(ad)");
al.add("*adf");
al.add("ike");

String s1 = "+あいう";
String s2 = "(ad)";

if(s1.indexOf("+") != -1){
s1 = s1.replaceAll("\\+","\\\\+");
}

if(s2.indexOf("(") != -1){
s2 = s2.replaceAll("\\(","\\\\(");
}
if(s2.indexOf(")") != -1){
s2 = s2.replaceAll("\\)","\\\\)");
}

Matcher m1;
Matcher m2;
Pattern p1 = Pattern.compile(s1);
Pattern p2 = Pattern.compile(s2);

for(String s : al){
m1 = p1.matcher(s);
m2 = p2.matcher(s);

if(m1.matches()){
System.out.println(s);
}else if(m2.matches()){
System.out.println(s);
}
}
}
}
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメント

非公開コメント

プロフィール

unyouman

Author:unyouman
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。