1

入力としてxmlを受け取り、正規表現を使用してタグ内の許容文字のリストをチェックするJavaプログラムがあり、この特殊文字のような許容文字以外を含むタグ全体を返す必要があります

XML入力

<?xml version="1.0"?>
<PayLoad>
<requestRows>****</requestRows>
<requestRowLength>1272</requestRowLength>
<exceptionTimestamp>2012070202281068-0700</exceptionTimestamp>
<exceptionTimestamp>201$2070202281068-0700</exceptionTimestamp>
<exceptionTimestamp>20120(702022810680700</exceptionTimestamp>
<exceptionDetail>NO DATA AVAILABLE FOR TIME PERIOD SPECIFIED   =</exceptionDetail>
</PayLoad>

許容文字リスト

\! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~

私は以下のように試しました

public static void main(String args[])
    {
        List<String> specialCharList = new ArrayList<String>();
        try{
                String responseXml="test";
                String SPECIAL_CHARACTER ="(<[\\w\\d]*>(?=[^<]*[^<\\w\\!\\#\\$\\%\\&\\\'\\(\\)\\\\ \\*\\\"\\+\\,\\-\\~\\}\\{\\.\\/\\:\\;\\=\\?\\@\\]\\[\\\\\\`\\|]).*</[\\w\\d]*>)";
                if (!(responseXml == null || responseXml.toString().length() < 1 || responseXml.toString().equals("")))
                {
                    Pattern patternObject = Pattern.compile(SPECIAL_CHARACTER);   
                    Matcher patternMatcher = patternObject.matcher(responseXml);   
                    while(patternMatcher.find())
                    {   
                      specialCharList.add(patternMatcher.group());
                    }
                    if(specialCharList.isEmpty() || specialCharList.size()<0)
                    {
                        specialCharList.add("No Special Character's Detected");
                    }
                }
        }catch(Exception e)
        {

        }
        System.out.println(specialCharList);
    }

しかし、期待どおりに機能していません。上記のシナリオの正規表現を作成するにはどうすればよいですか? 助けてください

4

1 に答える 1

0

まず、正規表現のいくつかの間違いに対処しましょう

(<[\w\d]*>(?=[^<]*[^<\w\!\#\$\%\&\'\(\)\ \*\"\+\,\-\~\}\{\.\/\:\;\=\?\@\]\[\\\`\|]).*</[\w\d]*>)

は;\wの省略形です。[A-Za-z0-9_]と の両方\w\d同じ文字セット内に含めること[...]は冗長であるため、 に<[\w\d]*>簡略化でき<[\w]*>ます。

また、バックスラッシュ '\'、閉じ括弧 ']'、および場合によってはマイナス記号 '-' を除いて、文字セット内でエスケープを行う必要はありません。空白文字には、使用する必要があります\s。これには、単一スペース、タブ付きスペース、および改行が含まれます。したがって、単純化すると、次のようになります。

[^<\w\!\#\$\%\&\'\(\)\ \*\"\+\,\-\~\}\{\.\/\:\;\=\?\@\]\[\\\`\|]

になる

[^<\w!#$%&'()\s*"+,-~}{./:;=?@\][\\`|]

次の正規表現はあまり効率的ではありません。文字を除外すると、常に計算量が大幅に増加します。1 つ以上の「無効な」文字を含むタグに一致します。

<[\w]*>((?!<[\w]*>).)*[^<\w!#$%&'()\s*"+,-~}{./:;=?@\][\\`|]((?!<[\w]*>).)*</[\w]*>

パフォーマンスが重要な場合は、エラーの解析方法を本当に再考する必要があることに注意してください。

この Web サイトは、正規表現の優れた紹介を提供します。

http://www.regular-expressions.info/tutorial.html

于 2013-01-03T09:40:21.000 に答える