2

重複の可能性:
Ruby で正規表現の一部をオプションにするにはどうすればよいですか?

一致するルビュラーを使用して正規表現を作成しようとしています:

On Feb 23, 2011, at 10:22 , James Bond wrote:

また

On Feb 23, 2011, at 10:22 AM , James Bond wrote:

ここに私がこれまでに持っているものがありますが、何らかの理由で一致していませんか? アイデア?

(On.* (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{1,2}, [12]\d{3}.* at \d{1,2}:\d{1,2} (?:AM|PM),.*wrote:)

AM/PM テキストをオプションにするにはどうすればよいですか? AM/PM に一致するか、どちらにも一致しないか?

4

3 に答える 3

1

これは日付情報をキャッチするようです。実際の日付を簡単に作成できるように、意図的にグループでキャプチャしました。

regex = /^On (\w+ \d+, \d+), \w+ (\S+) (\w*)\s*,/

[
  'On Feb 23, 2011, at 10:22 , James Bond wrote:',
  'On Feb 23, 2011, at 10:22 AM , James Bond wrote:'  
].each do |ary|
  ary =~ regex
  puts "#{$1} #{$2} #{$3}"
end
# >> Feb 23, 2011 10:22 
# >> Feb 23, 2011 10:22 AM

私は月に合わせようとはしませんでした。サンプル文字列は、電子メール メッセージの引用ヘッダーのように見えます。これらは非常に標準的で、ソフトウェアによって生成されるため、正規表現を単純化できるように、形式に多くの一貫性が見られるはずです。それらを信頼できない場合は、月名の略語の一致を使用して、誤検知の一致を無視するのに役立ててください。同じことが、日、年、および時間の値にも当てはまります。

正規表現で重要なのは、AM/PM が欠落している場合の対処方法です。

于 2011-02-27T01:36:51.977 に答える
0

多分これ

(On\s+(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+\d{1,2},\s+[12]\d{3},\s+at\s+\d{1,2}:\d{1,2}\s+(?:AM|PM)*,.*wrote:)

ただし、これらの行のみが一意であることを確認して確認できる場合は、正規表現の全範囲を使用する必要はありません。多分それは "On" で始まり "wrote:" で終わります、あなたの正規表現は単純かもしれません/^On.*wrote:/

于 2011-02-27T01:31:18.193 に答える
0

オプションにしたいグループの後に疑問符演算子を使用するだけなので、この場合は次のようになります。

(?:(?:AM|PM) )?

スペースも必ず一致させてください。そうしないと、AM/PM を含まない文字列に 2 つのスペースを含める必要があります。の解(?:AM|PM)*も と一致AMAMPMするため、おそらくそれはあなたが望むものではありません。しかし、後方参照を作成せずにそれらのグループを照合するのはなぜでしょうか? 値を使用しませんか?

後方参照に関する情報: http://www.regular-expressions.info/brackets.html

于 2011-02-27T02:05:24.040 に答える