2

文字列を配列に分割する正規表現があります。

区切り文字の一部を保持したいことを除いて、すべて正常に機能します。

これが私の正規表現です:

(&#?[a-zA-Z0-9]+;)[\s]

Javascriptで、私はやっています:

var test = paragraph.split(/(&#?[a-zA-Z0-9]+;)[\s]/g);

私の段落は次のとおりです。

Current addresses:  &dagger;    Biopharmaceutical Research and Development<br />
&Dagger;    Clovis Oncology<br />
&sect;  Pisces Molecular <br />
||  School of Biological Sciences    
&para;  Department of Chemistry<br />

問題は、配列に 5 ではなく 10 の要素を取得していることです。実際、区切り文字も要素として取得しています。私の目標は、分割された要素で区切り文字を保持し、新しい要素を作成しないことです。

ご助力ありがとうございます。

編集:

結果としてこれを取得したいと思います:

1. &dagger; Biopharmaceutical Research and Development<br />
2. &Dagger; Clovis Oncology<br />
3. &sect;   &sect;  Pisces Molecular <br />
||  School of Biological Sciences  
4.  &para;  Department of Chemistry<br />
4

3 に答える 3

1

コメントで述べたように、このソリューション (ちなみに、テストされていません) は、<br />要素を管理している場合にのみ機能します。ここ:

var text = paragraph.split("<br />"); // now text contains just the text on each line

for(var i = 0; i<text.length-1; i++) { // don't want to add an line break to our last line
    text[i] += " <br />"; // replace the <br /> elements on each line
}

変数textは配列になり、配列の各要素は元の段落の行になります。<br />各行の終わりに改行 ( ) が追加されています。特殊文字で分割したいと言っていましたが、私が見たところ、各行は改行で終わっているので、これは同じ効果があるはずです. 残念ながら、現時点ではより完全な回答を書く時間がありません。

于 2012-09-07T12:01:41.750 に答える
1

match代わりに使用してみてください:

var test = paragraph.match(/&#?[a-zA-Z0-9]+;\s[^&]*/g);

更新: 必要な空白の\s一致を追加しました。

説明:

  • &#?一致&およびオプション#(疑問符は前の 1 回または 0 回一致)

  • [a-zA-Z0-9]すべての大文字と小文字および数字の範囲です。アンダースコアも受け入れる場合は、これを に置き換えることができます\w

  • 記号は、最後の+パターンに 1 回以上一致する必要があることを意味するため、1 つまたは複数の文字 a ~ z、A ~ Z、および 0 ~ 9 の数字に一致します。

  • ;文字に一致します;

  • \s、クラスの空白に一致します。これには、スペース、タブ、およびその他の空白文字が含まれます。

  • [^&]*もう一度範囲ですが、^は最初の文字であるため、一致は否定されます。つまり、 - 文字に一致する代わりに&&. スターはパターンに 0 回以上一致します。

  • g最後に、最後の/手段の後、最初の一致の後globalmatch続行し、すべての一致の配列を取得します。

したがって、&とオプションのに一致し#、その後に任意の数の文字または数字 (ただし、少なくとも 1 つ) が続き;、その後に が続き、その後に空白が続き、その後に 0 個以上の文字が続きます&

于 2012-09-07T12:25:23.163 に答える
1

正規表現を使用すると、非常に簡単です。

var result = input.match(/&#?[^\W_]+;\s[^&]*/g);

ここでテストします

于 2012-09-07T12:30:40.857 に答える