解析器的正则表达式后视替代方案(js)
regex lookbehind alternative for parser (js)
早上好
(我看到这个话题有很多答案,但我找不到合适的答案)
我正在 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 中实现,所以我猜很多浏览器兼容性冲突...和我希望它至少具有 一点兼容性...
我考虑过:
- 尝试捕获组 (?:) 但它在...
之前消耗了 space
- 只需删除 spaces-check,但“:word”会以 "word"
的形式出现
- 解析文本 2 次,一次用于单词,另一次用于 spaces,但我担心将它们按正确的顺序排列会很痛苦
明白,我需要单词和所有 spaces,并排除一些单词。
我在其他方法中打开,比如不使用正则表达式。
我的最后一个选项:
删除 spaces-check 并以 正确的顺序 组织我的整个正则表达式,祈祷“:word”将保留在 "special words" 先分组。
我的问题:
这在 javascript 中行得通并且 可靠 吗?
我试过了
/(((:[a-z]+)|([ ]+)|([a-z]*))/g
在 https://regexr.com/ 中似乎有效,它在所有情况下都有效吗?
您说过您对非正则表达式解决方案持开放态度,但我可以为您提供一个同时包含这两种解决方案的解决方案。由于您不能依赖 lookbehind 的支持,因此只需捕获所有内容并过滤掉您不想要的内容,单词后跟一个冒号。
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);
我会使用 2 个正则表达式,第一个匹配单词,你不想要然后 replace
它们与 empty string
,这是简单的正则表达式:
/:\w+/g
然后 replace
和 empty string
。现在你有一个字符串,可以用这个正则表达式解析:
/([ ]+)|([a-z]*)/g
这是你的第二个正则表达式的简化版本,因为禁用词已经消失。
早上好
(我看到这个话题有很多答案,但我找不到合适的答案)
我正在 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 中实现,所以我猜很多浏览器兼容性冲突...和我希望它至少具有 一点兼容性...
我考虑过:
- 尝试捕获组 (?:) 但它在... 之前消耗了 space
- 只需删除 spaces-check,但“:word”会以 "word" 的形式出现
- 解析文本 2 次,一次用于单词,另一次用于 spaces,但我担心将它们按正确的顺序排列会很痛苦
明白,我需要单词和所有 spaces,并排除一些单词。 我在其他方法中打开,比如不使用正则表达式。
我的最后一个选项:
删除 spaces-check 并以 正确的顺序 组织我的整个正则表达式,祈祷“:word”将保留在 "special words" 先分组。
我的问题:
这在 javascript 中行得通并且 可靠 吗?
我试过了
/(((:[a-z]+)|([ ]+)|([a-z]*))/g
在 https://regexr.com/ 中似乎有效,它在所有情况下都有效吗?
您说过您对非正则表达式解决方案持开放态度,但我可以为您提供一个同时包含这两种解决方案的解决方案。由于您不能依赖 lookbehind 的支持,因此只需捕获所有内容并过滤掉您不想要的内容,单词后跟一个冒号。
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);
我会使用 2 个正则表达式,第一个匹配单词,你不想要然后 replace
它们与 empty string
,这是简单的正则表达式:
/:\w+/g
然后 replace
和 empty string
。现在你有一个字符串,可以用这个正则表达式解析:
/([ ]+)|([a-z]*)/g
这是你的第二个正则表达式的简化版本,因为禁用词已经消失。