スポンサーサイト

上記の広告は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);
}
}
}
}
スポンサーサイト

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

【Java】HashMapのvalueで、sortしたかった

ハッシュの値でソートしたかった時がありまして、
その際に、以下のようなコードを記述しました。
※キーでソートではないです。

<概要>
key = ユニークな値
value = 重複する数字

読み込むデータが複数のカンマ区切りのデータで、最後のカンマ以降の値が数値となっている。
最後のカンマまでの値は、ユニークなキーになる。

<何がしたかったか>
カンマ区切りのデータを値と数値に分けて、数値を降順でソートして、同じ形式で出力する。

<迷走した部分>
TreeMAPで簡単にsortできると思っていたら、調べた限りできなくて迷走。。。
Webの素晴らしきログから、以下の方法が導きだせたので、同じようなところで
悩まれた方の手助けになればと。。。(プログラム素人なので、信頼性はありませんが。。。)

で、導きだしたのは、Comparatorを実装して、値を比較しreturnすることにより解消。
でも結局は、ハッシュでソートではなくて、配列とコレクションでのソートなので、
タイトルは若干の誤りがあるような、ないような。。。

<コード>

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

class Sort{
public static void main(String [] args){
Sort sort = new Sort();
sort.execution();
}

void execution(){
ArrayList<String> data = new ArrayList<String>();
data.add("あいう,24,5");
data.add("test,8");
data.add("機械,20");
data.add("スーパー,14");
data.add("レスキュー,5,21");

Matcher m;
Pattern p = Pattern.compile("^(.*),(\\d+)$");
HashMap<String,Integer> hm = new HashMap<String,Integer>();

for(String s : data){
m = p.matcher(s);
if(m.matches()){
hm.put(m.group(1),Integer.parseInt(m.group(2)));
}
}

ArrayList<Map.Entry> array = new ArrayList<Map.Entry>(hm.entrySet());
Collections.sort(array,new Comparator<Object>(){
public int compare(Object o1, Object o2){
Map.Entry e1 =(Map.Entry)o1;
Map.Entry e2 =(Map.Entry)o2;
Integer e1Value = (Integer) e1.getValue();
Integer e2Value = (Integer) e2.getValue();
return (e2Value.compareTo(e1Value));
}
});

Iterator it = array.iterator();
while(it.hasNext()) {
Map.Entry obj = (Map.Entry)it.next();
System.out.println(obj.getKey() + "," + obj.getValue());
}
}
}



上記コード作成中にコンパイルした際に、以下のようなメッセージが出力されました。

注:Sort.java の操作は、未チェックまたは安全ではありません。
注:詳細については、-Xlint:unchecked オプションを指定して再コンパイルしてください。


そこで上記で言われた通りに『-Xlint:unchecked』指定で、再コンパイルしてみると
以下のメッセージが出力されました。

デスクトップ>javac -Xlint:unchecked Sort.java
Sort.java:33: 警告:[unchecked] 無検査変換です
検出値 : <anonymous java.util.Comparator>
期待値 : java.util.Comparator<? super java.util.Map.Entry>
Collections.sort(array,new Comparator(){
^
Sort.java:33: 警告:[unchecked] 無検査メソッド呼び出し: java.util.Collections
の <T>sort(java.util.List<T>,java.util.Comparator<? super T>) は (java.util
.ArrayList<java.util.Map.Entry>,<anonymous java.util.Comparator>) に適用されます。
Collections.sort(array,new Comparator(){
^
警告 2 個

デスクトップ>


で、これは配列とかをgenericsしていなかったから『未チェック』と注意されていたわけです。
上記部分は、Comparatorについての警告メッセージですが要は、以下のように該当する部分を
限定してあげることで、出力されなくなりました。

ArrayList array = new ArrayList(hm.entrySet());

ArrayList <Map.Entry> array = new ArrayList<Map.Entry>(hm.entrySet());


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

【Java】ログに含まれている特定の文字列の行だけを出力

ログに特定の文字列が含まれていて、
その特定の文字列の行を抽出しなければいけない際にこんな感じのを書きました。

今回は、『大会』という文字列を含む行を抜粋しなければいけないと仮定。

<読み込むデータ>

そういえば
一月にあった
とうもろこし大会の
相談をしたいねー
大会は、
とめどなく
そうだねー
だから大会
desuyone!


<コード>

import java.io.*;

class Unyou{
public static void main(String [] args){
BufferedReader br = null;
String fileName = "test.txt";

try{
br = new BufferedReader(new FileReader(fileName));
String line;

while((line = br.readLine()) != null){
if(line.indexOf("大会") != -1)
System.out.println(line);
}
br.close();
}catch(IOException ioe){
ioe.printStackTrace();
}
}
}


<結果>

とうもろこし大会の
大会は、
だから大会

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

プロフィール

unyouman

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

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

この人とブロともになる

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