2013-11-22 8 views
5

私は正規表現の使用方法を学んでいる:正規表現のベスト・プラクティス

私は <:==]:><:==}:>で区画二つの異なる種類のセクションに分割されたテキストファイル、で読んでいます。私はそれが]または}、私はちょうど行うことはできません

pattern.compile("<:==]:>|<:==}:>"); pattern.split(text) 

がこれをやっているかどうかをセクションごとに知っておく必要があります。

pattern.compile("<:=="); pattern.split(text) 

作品、そして私はちょうど最初の文字を見ることができますしかし、私は正規表現について理解する必要があるものを完全には把握していないので、私はそれに頼っていると思います。

ここでベストプラクティスは何ですか?また、結果の文字列に区切り文字を残したまま、文字列を分割する方法はありますか?区切り文字で区切られるようにしますか?

EDIT:ファイルはこのようにレイアウトされています

Old McDonald had a farm 
<:==}:> 
EIEIO. And on that farm he had a cow 
<:==]:> 
And on that farm he.... 
+0

マイ初期解(キャプチャグループに区切り文字を囲む)は(Pythonのような他の言語が働いているだろう)は、Javaで動作するようには見えないので、私はこれを再考する必要があります。小さなサンプルファイルを提供できますか?私は、セクションがどのように区切られているかをよく理解していません。区切り文字のペアで囲まれているのか、区切り文字が区切り文字の後に始まり、次の区切り文字で終わるのでしょうか? –

+0

@TimPietzckerうん、私は同じ実現を持っていた。ファイルのレイアウトの例については、私の編集を参照してください。それらは区切り文字のペアではなく、それぞれの終わりは次の始まりによって通知されます。また、私は<:?:>がいくつかの他のタイプのタグを意味することに注意してください。 – drewmoore

+0

出力として正確に何をしたいですか? ']'または '}'と一緒にテキストのセクション?そうであれば、区切られていない最初/最後のセクションで何をしたいですか?あなたはテキストのセクションが必要ですか、区切り文字を持つだけで十分ですか? – OGHaza

答えて

6

このためsplit()を使用しない良いアイデアかもしれません。代わりに試合を行うことができます:

List<String> delimList = new ArrayList<String>(); 
List<String> sectionList = new ArrayList<String>(); 
Pattern regex = Pattern.compile(
    "(<:==[\\]}]:>)  # Match a delimiter, capture it in group 1.\n" + 
    "(     # Match and capture in group 2:\n" + 
    " (?:    # the following group which matches...\n" + 
    " (?!<:==[\\]}]:>) # (unless we're at the start of another delimiter)\n" + 
    " .    # any character\n" + 
    ")*    # any number of times.\n" + 
    ")     # End of group 2", 
    Pattern.COMMENTS | Pattern.DOTALL); 
Matcher regexMatcher = regex.matcher(subjectString); 
while (regexMatcher.find()) { 
    delimList.add(regexMatcher.group(1)); 
    sectionList.add(regexMatcher.group(2)); 
} 
+1

あなたはこれを完全に突き刺したようです。私はすべてのあなたの質問に対する答えははいと思う。詳細については、この[Jan Goyvaertsによる正規表現のチュートリアル](http://www.regular-expressions.info/tutorial.html)、特に[グループのキャプチャ]に関するセクションを参照してください(http://www.regular-expressions .info/brackets.html)と[lookaround assertions](http://www.regular-expressions.info/lookaround.html)を参照してください。あなたの最後の質問については、より具体的になりますか?コメントは本当にこれに適していないので、おそらく別の質問の形で? –

+0

私はこのコメントが好きですが、静的な正規表現は通常、静的に(1回)コンパイルされ、複数回再利用されることに注意してください。 http://stackoverflow.com/questions/4935216/shouldnt-static-patterns-always-be-staticも参照してください。http://stackoverflow.com/questions/1360113/is-java-regex-thread-safe –