3

大文字のローマ数字が変換されないようにしながら、すべての大文字の単語を小文字に変換する単一の正規表現を作成しようとしています。

私が見つけた唯一の方法は、スペース、コンマ、またはピリオドが後に続くすべての大文字の単語、およびハイフンでつながれた単語をすべて小文字に変換することでした。次に、すべてのローマ数字を大文字に戻します。

これを使用して小文字に変換しました:

(\u+[ ,.-])

次に、疑わしいローマ数字をすべて見つけて交換する必要がありました。

これを行うためのより良い方法は何ですか? 運がなかった否定的な先読み表現を試しましたが、それらを書くのはあまり得意ではありません。

私がこれをテストしているサンプルは、米国憲法です。入力のサンプルを次に示します。

私たち米国の人々は、より完全な連合を形成し、正義を確立し、国内の平和を確保し、共通の防衛を提供し、一般的な福祉を促進し、自由の祝福を私たち自身と私たちの子孫に確保するために、次のように定めます。アメリカ合衆国のためにこの憲法を制定する。

第 1 条

宗派。1. ここに付与されたすべての立法権は、上院と下院で構成される米国議会に付与されるものとする。

宗派。2. 下院は、いくつかの州の全国民によって 2 年ごとに選ばれる議員で構成されるものとし、各州の選挙人は、州議会の最も人口の多い支部の選挙人に必要な資格を有するものとする。25 歳に達せず、合衆国市民として 7 年間過ごしていない者、および選出された時点でその者が所在する州の住民でない者は、下院議員であってはならない。選ばれました。

第四条。

第5条

第6条。

4

1 に答える 1

3

正規表現フレーバーが否定先読みをサポートしている場合は、次を試すことができます。

\b(?![LXIVCDM]+\b)([A-Z]+)\b

これは、「L、X、I、V、C、D、M で完全に構成されていない大文字の単語全体」(ローマ数字) を意味します。

また、「I」という単語が変換されるのを便利に停止します。(余談ですが、1 文字の大文字の単語が変換されるのを防ぎたい場合は、[A-Z]{2,}-- これを使用すると、大文字の "A" (文頭) と I が変換されるのを防ぐことができます。通常はそのままにしておきます)通常のケース)。

ただし、これらの文字だけで構成される単語が一致することはありません。私が思いつくのは、"DID" と、おそらく "DIV" (HTML のように)、"DIM" (次元のように)、"MID" だけです。 「MIDI」、「VIC」(ビクトリアのように?)...

ただし、ローマ数字の正規表現を変更して、ルールをもう少し考慮することができます。

(?=[MDCLXVI])M{0,3}(C[DM]|DC{0,3}|C{1,3})?(X[LC]|LX{0,3}|X{1,3})?(I[XV]|VI{0,3}|I{1,3})?

説明:

(?=[MDCLXVI])           # make sure we match at least something
                        # (since everything in this regex is optional)
M{0,3}                  # Can have 0 to 3 Ms, being thousands
(C[DM]|DC{0,3}|C{1,3})? # for the hundreds column can have CD, CM, 
                        # C, CC, CCC, D, DC, DCC, DCCC
(X[LC]|LX{0,3}|X{1,3})? # for the tens column can have XL, XC, 
                        # L, LX, LXX, LXXX, X, XX, XXX
(I[XV]|VI{0,3}|I{1,3})? # for the ones column can have IX, IV,
                        # V, VI, VII, VIII, I, II, III.

私はそれがすべての可能なローマ数字をカバーしていると思います....

正規表現フレーバーが否定先読みをサポートしていない場合は、次のようにすることができます。

\b((ROMAN_NUMERAL_REGEX)|([A-Z]+))\b

そして、「$2$3_converted_to_lower_case」に置き換えます (申し訳ありませんが、実際の変換自体を行う方法がわかりません)。

正規表現は、ローマ数字の正規表現 (および $2 でキャプチャされる)または他の正規表現 ($3 でキャプチャされる) のいずれかにのみ一致するため、上記は機能します。したがって、$2 または $3 のいずれかは常に空です。

于 2012-02-14T03:06:06.180 に答える