0

私はこのような文字列を持っています:

journals/cl/SantoNR90:::Michele Di Santo::Libero Nigro::Wilma Russo:::Modula-2 におけるプログラマ定義の制御抽象化

Michele Di SantoLibero Nigroをキャプチャする必要がありますWilma Russoが、最後の 1 つではありません。

この正規表現は、必要なものとほぼ一致します。

/(?<=::).*?(?=::)/

しかし、問題があり、3 番目のコロンをキャプチャします

str.scan(/(?<=::).*?(?=::)/) #=> [":Michele Di Santo", ...]

ご覧のとおり、最初の一致の先頭にはコロンがあります。

この 3 番目のコロンを回避するためにこの正規表現を修正するにはどうすればよいですか?

4

3 に答える 3

7

これには正規表現を使用しないでください。入力文字列を で:::分割し、結果の配列から 2 番目の文字列を取得し、それを で分割するだけ::です。正規表現バージョンよりも高速にコーディングでき、実行も高速で、読みやすくなっています。

編集:コード:

str.split(':::')[1].split('::')

CodePad で実行: http://codepad.org/1BNNwoh6

于 2012-10-08T20:32:39.057 に答える
3

それを行う式は次のようになります。

(?<=::)[^:].*?(?=::)

検索する文字列が常に "xxx:::A::B::C:::xxx" の形式で、A、B、C のみを気にする場合は、より具体的なものを使用することを検討してください。グループをキャプチャして A、B、C を取得します。

:::(.+?)::(.+?)::(.+?):::

$1$2および$3グループの一致が含まれます。

于 2012-10-08T20:47:33.737 に答える
0

split文字列は基本的にコンマではなくコロンを使用した CSV であるため、単純なものを使用します。

str = 'journals/cl/SantoNR90:::Michele Di Santo::Libero Nigro::Wilma Russo:::Programmer-Defined Control Abstractions in Modula-2'
items = split(':')
str1, str2, str3 = items[3], items[5], items[7]

=> [
      [0] "Michele Di Santo",
      [1] "Libero Nigro",
      [2] "Wilma Russo"
  ]

以下を使用することもできます。

str1, str2, str3 = str.split(':').select{ |s| s > '' }[1, 3]

コロンを引用できる場合は、CSV モジュールを使用し、フィールド区切り文字を「:」に設定します。

于 2012-10-08T21:40:31.373 に答える