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 />

问题是我的数组中有 10 个元素,而不是我应该的 5 个。事实上,我也将分隔符作为一个元素,我的目标是让分隔符与拆分的元素保持一致,而不是创建一个新的分隔符。

非常感谢您的帮助。

编辑:

我想得到这个结果:

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匹配。

解释:

  • &#?匹配&和可选#(问号匹配前一次或零次)

  • [a-zA-Z0-9]是所有大小写字符和数字的范围。如果您还接受下划线,则可以将其替换为\w.

  • 符号表示它应该匹配最后+一个模式一次或多次,因此它匹配一个或多个字符 az、AZ 和数字 0-9。

  • ;匹配;字符。

  • \s匹配类空白。这包括空格、制表符和其他空白字符。

  • [^&]*再次是一个范围,但由于^是第一个字符,匹配被否定,所以它不匹配&-characters 它匹配除了&. 星形匹配模式零次或多次。

  • g最后,在最后一个/意思之后global,并match在第一个匹配之后继续,并获得所有匹配的数组。

因此,匹配&和一个可选的#,后跟任意数量的字母或数字(但至少一个),后跟;,后跟一个空格,后跟零个或多个不是 的字符&

于 2012-09-07T12:25:23.163 回答
1

使用正则表达式非常简单:

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

在这里测试一下。

于 2012-09-07T12:30:40.857 回答