自分で微調整できる開始点は次のとおりです: jsFiddle。
<ul></ul>
最初に を追加し、次に s を追加するという 2 つの置換を行いました<li></li>
。(JavaScript が後読みアサーションをサポートしていれば、1 つのステップで行うのがより簡単だったでしょう。後読みアサーションがなくても可能ですが、面倒です。)
val = val.replace(/((?:(?:^|[\n\r]+)[\t ]*-[\t ]*[^\n\r]*)+)/g, "\n<ul>\n$1\n</ul>");
val = val.replace(/[\n\r]+[\t ]*-[\t ]*([^\n\r]*)/g, "\n <li>$1</li>");
これを構築する際にいくつかの仮定を立てましたが、元に戻す必要がある場合があります。
- 一連の改行を 1 つの改行として扱います。
- の前後のスペースとタブを削除します
-
。
次の入力、
hello, world.
- two
- things
hi, again.
- three
-more
-things
次の出力を作成します。
hello, world.
<ul>
<li>two</li>
<li>things</li>
</ul>
hi, again.
<ul>
<li>three</li>
<li>more </li>
<li>things</li>
</ul>
説明
最初の正規表現は、一連のリスト項目を識別するだけです。
( Captured group ($1).
(?: Group (one list item). -------------------+
|
(?: Group (for alternation). ---------+ |
| |
^ Start-of-string | |
| |
| OR <-----+ |
|
[\n\r]+ one or more newlines. |
|
) |
|
[\t ]* (Ignore tabs and spaces.) |
- (Dash.) |
[\t ]* (Ignore tabs and spaces.) |
|
[^\n\r]* List item text (everything but newlines). |
|
) |
+ One or more list items. <-----------------+
)
に取り込まれたこの一連のリスト アイテムは、タグ$1
で囲まれています。<ul></ul>
"\n<ul>\n$1\n</ul>"
2 番目の正規表現は、各リスト アイテムをタグでラップし<li></li>
ます。これは最初の正規表現と非常に似ているため、何が変更されたかを示す方が便利な場合があります。
first regex : /((?:(?:^|[\n\r]+)[\t ]*-[\t ]* [^\n\r]* )+)/g
differences : xxxxxxxxx x ( )xxx
second regex : / [\n\r]+ [\t ]*-[\t ]*([^\n\r]*) /g
言葉で、
リスト項目のセットは気にせず、各リスト項目だけを気にするので、定量化(?:...)+
に使用されたキャプチャ不可能なグループを削除できます。
最初の正規表現置換 (先頭\n<ul>\n
に a を追加) の後では、文字列の先頭からリスト項目を開始することは不可能であるため、代替を削除できます(?:^|...)
。
ただし、リスト アイテムのテキストをキャプチャすることに関心があるため、キャプチャ グループ を追加し(...)
ます。