2016-05-09 13 views
-1

私はかなり新しい正規表現ですが、私はそれを学びたいと考えています。私はいくつかのXMLを持つ複雑な何もしていないよ:2つのタグ間の文字列の値を取得

<root> 
    <friendlyName>Hello, I'm friendly</friendlyName> 
    <URL>http://localhost</URL> 
</root> 

私はフレンドリーネームの値を取得しようとしていますが、それが動作するように表示されません。私はhttps://regex101.com/のオンライン正規表現テスターを使用しましたが、これは私が期待しているものと一致するようです。しかし、Javaで試してみると、N/AN/Aという文字列が見つからない場合に返されます。

public String getXMLTagValue(String tagName) 
    { 
     Pattern pattern = Pattern.compile("<" + tagName + ">(.*?)</" + tagName + ">/s"); 
     Matcher matcher = pattern.matcher(xmlString); 
     while (matcher.find()) 
     { 
      return matcher.group(); 
     } 
     return "N/A"; 
    } 

私はHello, I'm friendlyを返すために、上記のコードを期待していますが代わりに、私はN/Aを得る:

以下は私のコードです。

ご協力いただきありがとうございます。

+9

正規表現を使用してXMLを解析しないでください。 XMLパーサを使用します。 XMLがどれほどシンプルであるかは関係ありません。 –

+0

'/ s'はあなたの' Pattern'文字列の最後にありますか? –

+0

あなたのXMLは整形されていない ''は '' – Sanjeev

答えて

0

あなたの正規表現が誤って定義され、それがなければなりません:

"<" + tagName + ">(.*?)</" + tagName + ">\\s" 

なく

"<" + tagName + ">(.*?)</" + tagName + ">/s" 
+0

Friendlyは最後にfriendlyNameであるはずだったタイプミスでした。私は/私も必要な行末を含めることだと信じて... – Boardy

+0

ありがとう...私は答えを更新します –

0

変更

"<" + tagName + ">(.*?)</" + tagName + ">/s" 

"<" + tagName + ">(.*?)</" + tagName + ">\\s" 

理由:

\ sメタ文字は、空白文字を見つけるために使用されます。
空白文字を使用できます
空白文字
タブ文字
復帰文字
改行文字
垂直タブ文字
フォームフィード文字

ので、真の形式は\sです。これはjava正規表現になると\\sになります(\はjavaの特殊文字です)


また、\\sを使用しているとは思いません。あなたはこのパターンを使用することができます:あなたのXML <friendlyName> ends with </friendly>を修正

"<" + tagName + ">(.*?)</" + tagName + ">" 
+0

なぜ彼らはそれを行う必要がありますか? –

+0

@SotiriosDelimanolis明確にするために私の答えを編集しました。 –

+0

まだ、コードでは不要です。 –

0

スタート、それがうまく形成されません。

"<" + tagName + ">(.*?)</" + tagName + ">/s" 

を::その後、正規表現が間違っている、あなたは置き換えることができ

"<" + tagName + ">(.*?)</" + tagName + ">\\s" 

が、本当にあなたは "\\ s" を必要としません。

タグ間にテキストのみが必要な場合は、結果文字列を返す前にopenタグとcloseタグも削除する必要があります。 以下は作業コードです。また、javax.xml.parsers.DocumentBuilderを使用して正規表現の代わりにXMLを解析する改良されたメソッドを追加しました。

private static String xmlString = 
          "<root>" 
          +"<friendly>Hello, I'm friendly</friendly>" 
          +"<url>http://localhost</url>" 
          +"</root>"; 

public static void main(String[] args) throws Exception { 

    String value = getXMLTagValue("friendly"); 
    System.out.println(value); 

    String out = getXMLTagValueImproved("friendly"); 
    System.out.println(out); 

} 

public static String getXMLTagValue(String tagName) 
{ 
    String openTag = "<" + tagName + ">"; 
    String closeTag = "</" + tagName + ">"; 
    Pattern pattern = Pattern.compile(openTag + "(.*?)" + closeTag); 
    Matcher matcher = pattern.matcher(xmlString); 
    while (matcher.find()) 
    { 
     return matcher.group().replaceAll(openTag, "").replace(closeTag, ""); 
    } 
    return "N/A"; 
} 

public static String getXMLTagValueImproved(String tagName) throws Exception { 

    InputSource is = new InputSource(new StringReader(xmlString)); 
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();; 
    Document doc = dBuilder.parse(is);  
    NodeList nl = doc.getDocumentElement().getElementsByTagName(tagName); 
    return nl.getLength() > 0 ? nl.item(0).getTextContent() : "N/A" ; 
} 

これが役立つことを願っています。

関連する問題