2016-11-07 4 views
2

私は望まない単語を含む辞書テキストファイルを持っています。正規表現を使用して同じ文字で構成される単語を選択するにはどうすればよいですか?

例:

aa 
aaa 
aaaa 
bb 
b 
bbb 

など

私はこれらの単語を選択し、それらを削除するには、正規表現を使用します。しかし、 私は長すぎると思われ、より効率的なアプローチが必要です。ここで

は、これまでの私のコードです:

/^a{1,6}$|^b{1,6}$|^c{1,6}$|^d{1,6}$|^e{1,6}$|^f{1,6}$|^g{1,6}$|^[i]{2,3}$/ 

私がすべての文字のためにこれをしなければならないようです。私はこれをもっと簡潔にどうすればいいですか?

+0

あなたはすべての文字のためにこれをしなかった場合であっても、何ñññññ' 'は? – tadman

+0

どのような辞書ですか? – Stefan

+0

辞書は、英語で存在するはずの単語のリストです。それらには、削除したい略語などが含まれています。 – chell

答えて

0

\b([a-z])\1{0,}\b 

と空

で置き換えます

ルビーコードサンプル:

re = /\b([a-z])\1{0,}\b/m 
str = 'aa aaa aaaa bb b bbb abc aa a pqaaa ' 
result = str.gsub(re,'') 
puts result 

Run the code here

+0

ありがとうございます。私はこれを私が理解し、既存のコードに適合させるのが簡単だったので、これを選択しました。 – chell

+0

もう一度リクエストしてください。私は「私」という言葉を削除したくない。どのように私は単一の文字 '私'の例外を持つことができますか? – chell

+0

使用できます:https://regex101.com/r/JSTpKG/5 –

3

それがダウンして独自の文字に単語を崩壊し、その中のひとつの文字と、それらのすべてを削除するには非常に簡単です:

words = "aa aaa aaaa bb b bbb etc aab abcabc" 

words.split(/\s+/).select do |word| 
    word.chars.uniq.length > 1 
end 
# => ["etc", "aab", "abcabc"] 

これは言葉にあなたの文字列を分割し、より多くを持っているだけでそれらの単語を選択し、それらの文字の1種類以上(.chars.uniq

+1

はい。有名なジェイミー・ザウィンスキーを引用すると:。。 *私が知っている、私は正規表現を使用します 『今、彼らは二つの問題を持っている* 正規表現は強力ですが、彼らは傾向がある」問題に直面したとき、一部の人々を、 は思います』書き込み専用になるようにすることは難しく、正確に一致させるのは難しいです(それ以上のことはありません)。 – EdvardM

+0

これは非常に興味深い考えです。ファイルは約5MBですがかなり大きいです。これを行うには、正規表現を使用してください – chell

+0

あなたは何度もこれをやっているように聞こえます。不要な単語を一度削除し、代わりに使うことができる新しい(クリーンな)ファイルを保存する方が簡単でしょうか? – Stefan

2
5つのオプションの後方参照が続く

^([AZ])\ 1?\ 1?\ 1?\ 1?\ 1?$

マッチ任意の単一の文字、最初の手紙に。

これはあまりにもうまくいくかもしれない:

^([AZ])\ 1 {、5}あなたがこの正規表現を試すことができます$

+0

それは本当に弱い正規表現です。それは、各長さのためにカスタマイズする必要があることはあまり良くありません。 – tadman

1

あなたはこのコードを使用し、また、繰り返しの数字またはアンダースコアを含めること(手紙のほかに)したい場合は、この

\b([a-zA-Z])\1*\b 

をお試しください:

\b([\w])\1*\b 

を更新:

Iが削除されないようにするには:

(?i)ii+|\b((?i)[a-hj-z])\1*\b 

(?i)大文字と小文字を区別しない文字を作成するために上記に追加されています。

デモ: https://regex101.com/r/gFUWE8/7

+0

ありがとうイブラヒムが使用します。私はまだ正規表現にiiとiiiに合致したいと思っています。 – chell

+0

@chell私の答えを更新しました。 – Ibrahim

関連する問題