2010-12-10 11 views
2

私はクラスのための正規表現パターンを学ぼうとしています。私は単純なHTMLレクサー/パーサーを作っています。私はこれがLexer/Parserを作るのに最も効果的な方法ではないことを知っていますが、Regexのパターンを理解することだけです。HTMLシンプルテキストの正規表現パターンを作成するには?

私の質問は、文字列にHTMLタグ(つまり<TAG>)が含まれておらず、HTMLエンティティ(つまり&ENT;)が含まれていないかどうかを確認するパターンを作成するにはどうすればよいですか?

これは私がこれまでに思い付くことができるものであるが、それはまだ動作しません:

.+?(^(?:&[A-Za-z0-9#]+;)^(?:<.*?>)) 

EDIT:唯一の問題は、私は私が見つける必要が最終的な結果を否定することはできませんということですそれが可能であればこの仕事を達成する完全なパターンですが、それはかわいらしくないかもしれません。私は言及したことはありませんが、それはHTMLページ内の任意のシンプルテキストにマッチするはずです。

+0

"hello" does have no HTML "hello <b>world</b>!" has HTML: <b> "Hello&nbsp;world" has HTML: &nbsp; 
可能重複(http://stackoverflow.com/questions/1732348/regex-match-open -tags-except-xhtml-self-contained-tags) –

+0

パターンを否定できないのはなぜですか?私はあなたの推論を得ることはありません... –

+0

あなたのHTML文字列をコピーして、次の正規表現パターンを使用してHTMLタグとエンティティを取り除くことができます(何もパターンを置き換えません)。そうすればプレーンテキスト(エンティティは実際の文字に変換されずに消えてしまいますが)になります。 –

答えて

1

パターンに従わない文字列を検索する場合は、パターンを一致させてからテストの結果を否定するのが最も簡単です。

<[^>]+>|&[^;]+; 

このパターンに一致する文字列は、少なくとも1つのタグ(定義済み)またはエンティティ(定義済みのとおり)を持ちます。したがって、必要な文字列はこのパターンと一致しない文字列です(タグやエンティティはありません)。

+0

'*'を '+'に変更して、キャプチャグループを削除します。 – aioobe

+0

良い点。一定。 –

+0

これは可能でしょうか? ^(?:<[^>)+> | &[^;] +;) –

2

<.+?>|&.+?;を使用して一致を検索し、結果を否定できます。

  • <.+?>

    は最初<その後、何も(1回以上)、その後>
  • &.+?;&その後、何も(1回以上)が最初に言って、その後ここ;

があると言いますideone.com demo hereの完全な例です。

import java.util.regex.*; 

public class Test { 
    public static void main(String[] args) { 
     String[] tests = { "hello", "hello <b>world</b>!", "Hello&nbsp;world" }; 
     Pattern p = Pattern.compile("<.+?>|&.+?;"); 
     for (String test : tests) { 
      Matcher m = p.matcher(test); 
      if (m.find()) 
       System.out.printf("\"%s\" has HTML: %s%n", test, m.group()); 
      else 
       System.out.printf("\"%s\" does have no HTML%n", test); 
     } 
    } 
} 

出力:[XHTMLの自己完結型のタグを除いて正規表現一致オープンタグ]の