2017-08-29 7 views
1

私の質問は、PythonのthisというScala(Java)のバリエーションです。Java文字列トークン化:パターン上で分割してパターンを保持

特に、私には文字列val myStr = "Shall we meet at, let's say, 8:45 AM?"があります。私はそれをトークン化したいと思います区切り文字(空白を除くすべて)を保持します。私のデリミタが文字だけだった場合、例えば。 .:?など、私が行うことができます:

[Shall, we, meet, at, ,, let's, say, ,, 8, :, 45, AM, ?]

を生み出す

val strArr = myStr.split("((\\s+)|(?=[,.;:?])|(?<=\\b[,.;:?]))")

しかし、私は拍子\\d+:\\d+区切りをしたい、と今でもしたいと思いますそれを保持する。分割された文の表現で論理和(?=(\\d+:\\d+))を追加

  1. 支援していない拍子の
  2. 外、:は次のとおりです。だから、何私がしたいことは

    [Shall, we, meet, at, ,, let's, say, ,, 8:45, AM, ?]

    注意です区切り文字自体は

どうすればいいですか?

+0

あなたは私のアプローチをチェックする機会を得たことがありますか? –

+0

はい、これまで述べてきたアプローチの両方をチェックしてきました。私はもっ​​と一般的な例について試しています。 –

+0

私のアプローチは、1)時間部分文字列全体、または2)区切り文字の任意の塊、または3)区切り文字ではないもの、および時間文字列と一致することに注意してください。私はそれがあなたが必要な方法で文字列をトークン化するのに十分な包括的だと信じています。 –

答えて

1

その方法は、あなたがより良い方法で得るもの制御することができるので、私は、文字列を分割しないで、すべてのトークンを一致勧め:

\b\d{1,2}:\d{2}\b|[,.;:?]+|(?:(?!\b\d{1,2}:\d{2}\b)[^\s,.;:?])+ 

regex demoを参照してください。

最も具体的なパターンにマッチし始め、最後のパターンは最も一般的なものです。または

  • [,.;:?]+ - - 1以上,.;:、2桁、:、ワード境界
  • |で囲まれた2桁1 -

    詳細

    • \b\d{1,2}:\d{2}\b? chars
    • | - または
    • (?:(?!\b\d{1,2}:\d{2}\b)[^\s,.;:?])+ - 時間文字列の開始点ではない区切り文字または空白([^\s,.;:?])ではない任意の文字に一致します。

    this snippet考えてみましょう:

    val str = "Shall we meet at, let's say, 8:45 AM?" 
    var rx = """\b\d{1,2}:\d{2}\b|[,.;:?]+|(?:(?!\b\d{1,2}:\d{2}\b)[^\s,.;:?])+""".r 
    rx findAllIn str foreach println 
    

    出力:

    Shall 
    we 
    meet 
    at 
    , 
    let's 
    say 
    , 
    8:45 
    AM 
    ? 
    
  • +0

    任意の文脈で1,2桁の数字、 ':'、2桁の数字にマッチさせたい場合は、 '\ d {1,2}:\ d {2}'の周りの単語境界を削除することができます。 –

    +1

    私のクエリは、私が持っていたより多くのユースケースの例です。そして、あなたのソリューションは任意のパターンに拡張されます。例えば。電子メールアドレス、日付、タイムスタンプなどのパターン文字列を指定し、それらを連結することができます。 ありがとうございます。 –

    関連する問題