0

* 文字で囲まれた文字列に一致する正規表現を書きたいと思っています。これは、それらを使用して**物事を太字にする** ようにマークダウンするのと同じです。

しかし、私はまた、最初と最後の*の数を可変量にしたいと思っています。星の数は、その文字列の重要性に相当します。

現時点ではこれを使用しています。

/(\*\*\*|\*\*|\*)(.*?)\1/

どちらの側でも最大 ***3*** で機能します。これは、* の間の文字列と *** を含む文字列の両方を返します。次に、その文字列の長さを数えて * の数を取得します。

Ruby では、これは次のようになります。

"*this is important*, but this is ***very important***.scan(/(\*\*\*|\*\*|\*)(.*?)\1/).each do |match|
    points << { :str => match[1], :importance => match[0].length }
end

正規表現はほとんどの部分で正常に機能していますが、********本当に重要なものを取得したい場合********; 表現は少し手に負えなくなります-これまでの方法でそれを行います.

私の現在のパターンは、* の量を検索し、それと同じ文字列の別の出現の間のテキストを見つけることを理解しています。しかし、次のような文字列などの人為的エラーを説明することもできれば便利です。

**これは非常に重要*ですが、***これは本当に重要です****。

皆さんありがとう!

4

1 に答える 1

2

単に以下はどうですか?

/(\*+)(.*?)\1/

\*+は 1 つ以上*の です。

または、特定の金額に制限する場合は、次のようにします。

/(\*{1,5})(.*?)\1/

\*{1,5}は 1 ~ 5*の間の任意の場所を意味します。明らかに、1 と 5 は自由に変更できます。

両側で異なる長さ:

上記は*、両側の同じ量の に対して機能します (後方参照のため\1)。

両側で異なる量を許可したい場合は、\*+代わりに を使用できます\1

/(\*+)(.*?)\*+/
于 2013-09-02T14:47:30.180 に答える