2011-07-03 22 views
59

私はいくつかのカスタムタグを持つファイルを持っています。タグ間に文字列を抽出する正規表現を書きたいと思います。たとえば、私のタグが:タグ間でテキストを抽出するJava正規表現

[customtag]String I want to extract[/customtag] 

タグの間の文字列だけを抽出するにはどうすればよいでしょうか。このコードは、正しい方向の一歩のようです:

次に何をするべきかわかりません。何か案は?ありがとう。

+1

、あなたは正規表現でメタ文字は '[]'角括弧をエスケープする必要があります。 – ridgerunner

答えて

127

あなたは正しい道を歩いています。次のように今、あなたはただ、目的のグループを抽出する必要があります。

final Pattern pattern = Pattern.compile("<tag>(.+?)</tag>"); 
final Matcher matcher = pattern.matcher("<tag>String I want to extract</tag>"); 
matcher.find(); 
System.out.println(matcher.group(1)); // Prints String I want to extract 

あなたが複数のヒットを抽出したい場合は、これを試してみてください。

public static void main(String[] args) { 
    final String str = "<tag>apple</tag><b>hello</b><tag>orange</tag><tag>pear</tag>"; 
    System.out.println(Arrays.toString(getTagValues(str).toArray())); // Prints [apple, orange, pear] 
} 

private static final Pattern TAG_REGEX = Pattern.compile("<tag>(.+?)</tag>"); 

private static List<String> getTagValues(final String str) { 
    final List<String> tagValues = new ArrayList<String>(); 
    final Matcher matcher = TAG_REGEX.matcher(str); 
    while (matcher.find()) { 
     tagValues.add(matcher.group(1)); 
    } 
    return tagValues; 
} 

をしかし、私は正規表現が最良の答えではないことに同意しますここに。興味がある要素を見つけるためにXPathを使用します。詳細はThe Java XPath APIを参照してください。

+3

ありがとう、それは私が必要としたものです。私はXPathを見ていきますが、今のところこのソリューションはうまくいくと思います。私のアプリケーションは非常にシンプルで、おそらくそのようになります。再度、感謝します! – b10hazard

+0

ありがとう、それは働いた! – Imran

+0

本当に助けてくれてありがとう –

1

このプレフィックスの前に「正規表現を使用してXMLを解析してはいけません。これは、正しく機能しないエッジケースと、複雑性が増している正規表現です。それを修正しようとする。

言われて、あなたは文字列に一致して、必要なグループ掴んで進める必要があること:非常に正直に言うと

if (m.matches()) 
{ 
    String result = m.group(1); 
    // do something with result 
} 
9

を、正規表現は、構文解析のこのタイプのために最高のアイデアではありません。あなたが投稿した正規表現は、おそらく単純なケースではうまくいくでしょうが、事が複雑になると大きな問題(正規表現で確実にHTMLを解析できないのと同じ理由)が発生します。私はあなたがおそらくこれを聞きたくないのを知っている、私は同じタイプの質問をしなかったことを知っているが、私はすべての正規表現を使用しようとしなくても、

jTopasは非常に手軽にパーサーを書くことができます(私は強く標準的なJavaスキャナ/ etc ..ライブラリよりjtopasを提案しています)。あなたがアクションでjtopasを見たい場合は、hereは、私はあなたがXMLファイルを解析する場合は、XMLパーサライブラリを使用する必要があるファイルのthis種類

を解析するjTopasを使って書いたいくつかのパーサです。あなただけの楽しみのためにそれをやっている場合を除きてはいけないそれをyouselfを行い、そこ

+0

提案していただきありがとうございます。私はそれらをブックマークしており、将来のプロジェクトでこれを使用することを確かめます。今のところ、私が解析しているファイルは非常に小さい/簡単なので、正規表現の方法はおそらく私が行くだろう。 – b10hazard

2
final Pattern pattern = Pattern.compile("tag\\](.+?)\\[/tag"); 
    final Matcher matcher = pattern.matcher("[tag]String I want to extract[/tag]"); 
    matcher.find(); 
    System.out.println(matcher.group(1)); 
4

実績のあるオプションのplently、一般的なシンプルかつ

Pattern pattern = Pattern.compile("<(\\w+)(+.+)*>((.*))</\\1>"); 
    System.out.println(pattern.matcher("<asd> TEST</asd>").find()); 
    System.out.println(pattern.matcher("<asd TEST</asd>").find()); 
    System.out.println(pattern.matcher("<asd attr='3'> TEST</asd>").find()); 
    System.out.println(pattern.matcher("<asd> <x>TEST<x>asd>").find()); 
    System.out.println("-------"); 
    Matcher matcher = pattern.matcher("<as x> TEST</as>"); 
    if (matcher.find()) { 
     for (int i = 0; i < matcher.groupCount(); i++) { 
      System.out.println(i + ":" + matcher.group(i)); 
     } 
    } 
タグ、属性と値を見つけるために少し原始的なアプローチがあります
2

これを試してみてください。たとえば

Pattern p = Pattern.compile(?<=\\<(any_tag)\\>)(\\s*.*\\s*)(?=\\<\\/(any_tag)\\>); 
Matcher m = p.matcher(anyString); 

String str = "<TR> <TD>1Q Ene</TD> <TD>3.08%</TD> </TR>"; 
Pattern p = Pattern.compile("(?<=\\<TD\\>)(\\s*.*\\s*)(?=\\<\\/TD\\>)"); 
Matcher m = p.matcher(str); 
while(m.find()){ 
    Log.e("Regex"," Regex result: " + m.group())  
} 

出力:手始めに

10エネ

3.08パーセント

0
String s = "<B><G>Test</G></B><C>Test1</C>"; 

    String pattern ="\\<(.+)\\>([^\\<\\>]+)\\<\\/\\1\\>"; 

     int count = 0; 

     Pattern p = Pattern.compile(pattern); 
     Matcher m = p.matcher(s); 
     while(m.find()) 
     { 
      System.out.println(m.group(2)); 
      count++; 
     } 
関連する問題