web-dev-qa-db-ja.com

#hashtagに一致するが#hashtagには一致しない正規表現。 (セミコロン付き)

私は現在の正規表現を持っています:

/(?<=[\s>]|^)#(\w*[A-Za-z_]+\w*)/g

文字列に対してテストしています:

Here's a #hashtag and here is #not_a_tag; which should be different. Also testing: Mid#hash. #123 #!@£ and <p>#hash</p>

私の目的では、この文字列で検出されるハッシュタグは2つだけです。 しない;で終わるハッシュタグに一致するように式を変更する方法を考えています。この例では、これは#not_a_tag;です。

乾杯。

8
Wex

以下についてはどうですか:

\B(\#[a-zA-Z]+\b)(?!;)

正規表現のデモ

  • \ B->単語の境界ではありません
  • (#[a-zA-Z] +\b)->キャプチャグループは#で始まり、その後に任意の数のa-zまたはA-Zが続き、最後にワード境界があります
  • (?!;)->が続かない;
17
tk78

否定先読みreegexを使用できます。

/(?<=[\s>]|^)#(\w*[A-Za-z_]+\w*)\b(?!;)/
  • \b-単語の境界により、単語の終わりにいることが保証されます
  • (?!;)-次の位置にセミコロンがないと断言します

RegExデモ

4
anubhava

Anubhavaの回答に似ていますが、\w*\d*の違いは\w文字だけなので、[A-Za-z_]の2つのインスタンスを0-9に置き換えます。

これにより、ステップ数が588から90に削減されます。

(?<=[\s>])#(\d*[A-Za-z_]+\d*)\b(?!;)

Regex101デモ

1
garyh
/(#(?:[^\x00-\x7F]|\w)+)/g

#で始まり、次に少なくとも1つの(+)ANCIIシンボル([^\x00-\x7F]、非ANCIIシンボルを除く範囲)またはWordシンボル(\ w)。

これは、「#їжак」のようなANCII記号を含むケースをカバーする必要があります。

0
ne4istb

これがベストプラクティスです。

(#+[a-zA-Z0-9(_)]{1,})
0
Naveed