2009-04-03 9 views
3

私は、単語以外の文字を含むすべての単語を削除するための正規表現を考え出しています。Perlで単語以外の文字を含むトークンをすべて削除するにはどうすればよいですか?

したがって、コロン、コンマ、ナンバー、ブラケットなどが含まれている場合は、文字だけでなくその語をラインから削除します。私はこれまでこれを持っています。

$wordline = s/\s.*\W.*?\s//g; 

ダッシュでアポストロフィを使用して文字列を削除すると完璧である必要はありません。正規表現の土地で

+0

単語にはどのように単語以外の文字が含まれていますか? – MarkusQ

+0

正規表現の文脈では、 "非単語"の文字には、ハイフン(例えば、速記)やアポストロフィ(例えば、しないなど)が含まれます。 – Telemachus

答えて

2
s/\w*([^\w\s]|\d)+\w* ?//g; 
+0

なぜ^ \ wではなく\ Wですか?特定の理由があったのか不思議です。 – Telemachus

+0

はい、\ Wはスペースをキャッチします。^ \ w \ sはしません。 –

+0

@ Telemachus:彼はまた、スペース文字を除外したいので。 \ Wにはスペースが含まれます。 – runrig

3
$wordline = join(" ", grep(/^\w+$/, split(/\s+/, $wordline))); 
+0

これは私がやることです。ただし、\ wにはアンダースコア(_)も含まれています。あなたがそれを望まないならば、自分の文字クラスを指定するだけです。 –

+0

OPでも数字は欲しくないので、/^[A-Za-z] + $ /(またはUnicode対応の同等物)を残します。 –

+0

もう一つの警告:トークンがどのように分割されるかによって、ブライアンGは分割文字をそのまま保つことができます。ソリューションによって、すべてのトークンセパレータがに変更されます。 – user55400

2
s/(?<!\S)(?![A-Za-z]+(?:\s|$))\S+(?!\S)//g 

、 "単語文字は" 文字、数字、またはアンダースコア([A-Za-z0-9_])です。あなたが手紙を意味するためにそれを使用しているように聞こえるので、\w\Wはあなたに良いことをしません。私の正規表現のマッチ:

  • 非空白文字の束を:\S+

  • 付いていない:(?<!\S)または続く:非空白文字によって(?!\S)

  • すべての文字が英字でない限り: (?![A-Za-z]+(?:\s|$))

これはすべてのspそれが削除する単語を囲むエース。それらを正しく扱うことは、あなたが期待するよりもややこしいです。別の手順で行う方がはるかに簡単です(例:

s/^ +| +(?= |$)//g 
+0

[A-Za-z]はUnicodeを扱っていないので、おそらく[[:alpha:]]を代わりに使いたいと思うでしょう。 –

+0

私は教師の免許を請求します。 :) [A-Za-z]では、あなたがマッチしているもの(そしてあなたがしていないもの)が完全にはっきりしています。 BTW、[[:alpha:]]はUnicodeも扱いません。それはPOSIXです。「基盤となるプラットフォームのロケールに文字として分類されたもの」のことを言います。 –

関連する問題