解析器(js)的正则表达式后向替代

时间:2018-11-17 03:14:20

标签: javascript regex parsing lookbehind

早上好

(我看到此主题有很多答案,但找不到合适的答案)

我正在用javascript写一个小解析器,它将文本切成这样的部分:

var tex = "hello   this :word is apart"

var parsed = [
  "hello",
  "   ",
  "this",
  " ",
  // ":word" should not be there, neither "word"
  " ",
  "is",
  "apart"
]

完美的正则表达式是:

/((?!:[a-z]+)([ ]+|(?<= |^)[a-z]*(?= |$)))/g

但是,它有一个正向外观,据我所读,它仅在2018年用javascript实现,因此我猜想许多浏览器兼容性冲突...而且我希望它至少具有一个兼容性差 ...

我考虑过:

  • 尝试捕获组(?:),但是它会占用...之前的空间
  • 仅删除空格检查,但“:word”作为“ word”出现
  • 将文本解析两次,一次为单词,另一次为空格,但我担心将它们按正确的顺序放置会很麻烦

理解,我需要单词和所有空格,并排除一些单词。 我对其他方法持开放态度,例如不使用正则表达式。

我的最后一个选项

删除空格,并按正确的顺序组织我的整个正则表达式,祈祷“:word”将在“特殊单词”组中保留在其他任何内容之前。

我的问题

可以在javascript中使用,并且可靠吗?

我尝试了

/(((:[a-z]+)|([ ]+)|([a-z]*))/g
https://regexr.com/中的

似乎有效,是否在每种情况下都能正常工作?

2 个答案:

答案 0 :(得分:1)

您说过,您可以使用非正则表达式解决方案,但我可以给您一个包括这两种解决方案的解决方案。由于您不能依靠幕后支持,因此只需捕获所有内容并过滤掉不需要的内容即可,单词后跟冒号。

const text = 'hello   this :word is apart';
const regex = /(\w+)|(:\w+)|(\s+)/g;
const parsed = text.match(regex).filter(word => !word.includes(':'));

console.log(parsed);

答案 1 :(得分:1)

我将使用2个正则表达式,第一个与单词匹配,您不想要,然后用replace empty string对其进行修饰,这是简单的正则表达式:

/:\w+/g

然后replaceempty string。现在您有了一个字符串,可以使用此正则表达式进行解析:

/([ ]+)|([a-z]*)/g

这是第二个正则表达式的简化版本,因为禁止的单词已经消失了。