- PR -

正規表現について

1
投稿者投稿内容
BB
ベテラン
会議室デビュー日: 2005/05/08
投稿数: 52
投稿日時: 2005-05-08 21:34
正規表現で
1.文字列に"FLG0"が含まれている場合
2."NO***IP"の***の部分の数値を取得
3."IP***"の***の数値を取得

以上機能を追加したいのですが、2. 3.の実装方法が分かりません。

よければ対処法を教えていただけるとありがたいです。

***** ***** ***** ***** ***** ***** *****
ちなみに以下の例では
取得したい値は
aaa→150 130
bbb→50 0
です。


String aaa = "AAAFLG0BBBNO150IP130";
String bbb = "AAAFLG0BBBNO50IP0";

Pattern pattern = Pattern.compile(".*FLG0.*");
Matcher matcher = pattern.matcher(aaa);

if(matcher.matches()){
   System.out.println("HIT");
}
***** ***** ***** ***** ***** ***** *****


かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-05-08 22:16
コード:
public class Test {

	public static void main(String[] args) {
		args = new String[] {
				"AAAFLG0BBBNO150IP130",
				"AAAFLG0BBBNO50IP0",
				"AAAFLG0BBBNO50IP550",
				"AAAFLG1BBBNO50IP0"
		};
		Pattern p = Pattern.compile(".*FLG0.*NO(.*)IP(.*)");
		for (int i = 0; i < args.length; i++) {
			Matcher m = p.matcher(args[i]);
			if (m.matches()) {
				System.out.println(m.group(1));
				System.out.println(m.group(2));
			}
		}
	}
}


こんな感じでどうですか?
グループを使ってみました。
BB
ベテラン
会議室デビュー日: 2005/05/08
投稿数: 52
投稿日時: 2005-05-09 10:26
やりたかったことはまさにこれです!!

かつのりさんに記述して頂いたソースを少し変更してみました。
変更点:NO*** IP***の部分は数値部しか取得しない

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
String[] args = new String[] {
"AAAFLG0BBBNO150ddIP13022",
"AAAFLG0BBBNO50ddIP0d",
"AAAFLG0BBBNO50ddIP550d",
"AAAFLG1BBBNO50dIP0d"
};
Pattern p = Pattern.compile(".*FLG0.*NO(.[0-9]).*IP(.[0-9])");
for (int i = 0; i < args.length; i++) {
Matcher m = p.matcher(args[i]);
if (m.matches()) {
System.out.println(m.group(1));
System.out.println(m.group(2));
}
}
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

しかし実際変更してみると結果が表示されなくなってしまいました、、、。
どうも、IP(.[0-9])の部分がまずいみたいなのですが。。。
(この部分をIP(.*)に戻すと結果が表示される)

またお助けいただけないでしょうか?
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2005-05-09 10:57
コード:

Pattern p = Pattern.compile(".*FLG0.*NO(.[0-9]).*IP(.[0-9])");


「(.[0-9])」とあるのがよくわからないのですが。
こんなのでどうでしょう。
コード:

Pattern p = Pattern.compile(".*FLG0.*NO([0-9]*).*IP([0-9]*)");


こんな風にもかけます。
コード:

Pattern p = Pattern.compile("FLG0\w*NO(\d*)\w*IP(\d*)");


「\d」がなんたるかは、自分で調べてみてください。

あと老婆心でありますが、「.*」は多用しない方がいいと思います。
「.」は「\d」「\w」に、「*」も「+」に置き換えられるならそうした方がいいです。
2週間もたつと、自分でもメンテナンスできなくなっちゃいますよ。(- -;

<追記>
むむ。
本文中で「円マーク」を使用する方法はないものですかな。
<追記2>
[0-9]を利用したものを追加。
最初も書いておくべきでしたね。

[ メッセージ編集済み 編集者: Edosson 編集日時 2005-05-09 11:16 ]
BB
ベテラン
会議室デビュー日: 2005/05/08
投稿数: 52
投稿日時: 2005-05-14 11:02
Edossonさんお礼が遅くなり大変申し訳ございませんでした。

Edossonさんの教えていただいた方法で思った通りのものを実装することができました。
正規表現、、、。なかなかおくが深いですが、使いこなせれば
大変大きな武器になることを知りました。

有難うございました!!
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-05-16 11:27
解決されているようですが、今回のような、固定フォーマットに対する
パースの課題なら、MessageFormatでもイケルと思いますよ。
C言語でいうところのscanf()標準関数に該当する処理をしてくれます。

コード:
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;

public class ParseTest {
	public static void main(String[] args)throws Exception {
		args = new String[] {
				"AAAFLG0BBBNO150IP130",
				"AAAFLG0BBBNO50IP0",
				"AAAFLG0BBBNO50IP550",
				"AAAFLG1BBBNO50IP0"
		};
		MessageFormat mf = new MessageFormat("AAAFLG{1,number}BBBNO{2,number}IP{3,number}"); 
		for(int i = 0 ; i < args.length ;i++){
			Object[] array = mf.parse(args[i]);
			System.out.println(new ArrayList(Arrays.asList(array)));
		}
	}
}

ぷさいくろう
ぬし
会議室デビュー日: 2006/08/30
投稿数: 1034
投稿日時: 2006-10-06 10:40
>正規表現で
>1.文字列に"FLG0"が含まれている場合
>2."NO***IP"の***の部分の数値を取得
>3."IP***"の***の数値を取得
>
>以上機能を追加したいのですが、2. 3.の実装方法が分かりません。

^(?=.*FLG0).*?NO([0-9]+)IP([0-9]+).*$
の一個目と二個目


[ メッセージ編集済み 編集者: ぷさいくろう 編集日時 2006-10-10 07:06 ]
1

スキルアップ/キャリアアップ(JOB@IT)