【问题标题】:Javascript and RegEx: Split and keep delimiterJavascript 和 RegEx:拆分并保留分隔符
【发布时间】:2012-09-07 11:45:28
【问题描述】:

我有一个正则表达式,可以将我的字符串拆分成数组。

一切正常,除了我想保留分隔符的一部分。

这是我的正则表达式:

(&#?[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 />

【问题讨论】:

  • @ElliotBonneville:在哪里?我无法得到解决方案。
  • 哦,抱歉,我没有看到它是一个链接。
  • 您是否要创建template
  • 我已经播下了那个帖子,但我无法找到我的问题的答案。

标签: javascript regex delimiter


【解决方案1】:

尝试改用match

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

更新:添加了必需的空格 \s 匹配。

解释:

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

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

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

  • ; 匹配字符 ;

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

  • [^&amp;]* 又是一个范围,但由于^ 是第一个字符,匹配被否定,因此它不匹配&amp; 字符,而是匹配除&amp; 之外的所有字符。星形匹配模式零次或多次。

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

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

【讨论】:

  • 非常感谢。如果可能的话,我是否也可以检查特殊字符后是否有空格作为分隔符。
  • @Milos 您想要空格 (0x20) 还是任何空白(空格、制表符、换页、换行和其他 unicode 空格)?
  • 太好了,非常感谢,这正是我所需要的。如果可能的话,请你给我一些关于你给我的正则表达式如何工作的解释。我知道,我在浪费你的时间,对不起,但我想理解它,而不仅仅是复制粘贴。 :)
  • @Milos 太好了,您想了解它!如果有不清楚的地方请告诉我。
  • @Milos 没问题!顺便说一句,您可以使用regexpal 来玩转正则表达式并实时查看它匹配的内容。
【解决方案2】:

正如我在评论中所说,此解决方案(顺便说一句,未经测试)仅在您管理 &lt;br /&gt; 元素时才有效。这里:

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 现在是一个数组,其中数组的每个元素都是原始段落的一行。换行符 (&lt;br /&gt;) 已添加回每行的末尾。您刚刚提到要拆分特殊字符,但据我所知,每一行都以换行符结尾,所以这应该有同样的效果。不幸的是,我目前没有时间写出更完整的答案。

【讨论】:

  • 谢谢,但我想你误解了我的问题。我知道如何用特殊字符作为分隔符来分割我。我们可以忘记
    。我只需要将字符串拆分为以特殊字符开头的元素,并在元素中保留这些特殊字符。
  • 我很害怕,因为我没有太多时间来回答这个问题。
【解决方案3】:

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

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

测试它here

【讨论】:

    猜你喜欢
    • 2017-04-01
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 2012-08-13
    • 2016-11-26
    • 2022-11-03
    相关资源
    最近更新 更多