4

以下の正規表現は、単一のアスタリスク文字で囲まれたすべてのシーケンスに一致します。これは、Markdown でイタリック体のテキストがどのように強調されるかです。強調に使用されるアスタリスクを含むテキストを書式設定したい。それに加えて、シーケンス内に独立したアスタリスクを許可します。例*This is italic text\n with * in between*

/\*[^\*\s]([^\*]|(\*\s))*[^\*\s]\*/g

さらに、Markdown では、太字のテキストは 2 つのアスタリスク文字によって非常によく似た方法で強調されます。それらを一致させるために、次の正規表現を使用します。

/\*\*[^\*\s]([^\*]|(\*\s))*[^\*\s]\*\*/g

どちらも独自に機能しますが、一緒に適用すると、太字テキストの内部もイタリック テキストとして検出されます。したがって、外側のアスタリスクを除いて、書式設定されたテキストは太字と斜体の両方になります。これを修正するには、斜体のシーケンスを 2 番目のアスタリスクのペアで囲むことは許可されていないことを表現する必要があります。

問題は、[^\*]他の文字が必要であるため、文字がまったく必要ないことです。上記の最初の正規表現が、検索文字列の最初または最後で一致しているにもかかわらず、それらが追加のアスタリスクで囲まれている場合、一致しないことをどのように表現できますか?

注意として、私は JavaScript を使用しているため、後読みは利用できません。

4

2 に答える 2

1

「文字なし、または*以外の文字」と言うことができます:

(^|[^\*])

そしておそらく、文字クラス内のエスケープは冗長です:

(^|[^*])

同じことが終了マーカーにも当てはまります。

($|[^*])
于 2013-11-09T11:37:28.670 に答える
1

編集:質問を誤解していたので、制約のある新しいパターンを提案します:

/\*((?:[^\s*]+|\s+\*?)*)?\*/

興味深いのは、パターン全体にマーカーが含まれており、キャプチャ グループにコンテンツが含まれていることです。コンテンツはオプションであることに注意してください ("**"は空のコンテンツを囲む有効なマーカーです)


古い投稿:

文字列内のどのアスタリスクが終了アスタリスクかを選択する規則がないため、あなたが尋ねることは不可能です。アスタリスクをマーカーとして使用する場合は、ユーザーがリテラル アスタリスクをエスケープする必要があります。

文字列の例:

*This is italic text\n with \* in between* text *an other italic part* text

この種の文字列を処理するには、次のパターンを使用してエスケープ文字を回避できます。

/\*(?:[^*\\]+|\\{2}|\\[\s\S])*\*/
于 2013-11-09T12:08:07.367 に答える