我想用3个参数构建一个函数:
var function = searchMyRegex(begin_marker, end_marker, text) { ... }
我需要一个RegExp,它会给出一定的字符串,给定开头和结尾,但它是我最短的版本,意味着开头和结尾都不在两个标记之间
例如
var text = "Lorem ipsum ipsum sit amet amet adipisicing elit"
如果BEGIN为ipsum
且END为amet
,我希望得到ipsum sit amet
,而不是ipsum ipsum sit amet amet
我试图解决自己的方式是这样的:
new RegExp(begin_marker + "[^" + end_marker + "]*\ " + end_marker);
但这似乎不起作用,我不知道为什么。
答案 0 :(得分:4)
你可以使用这种结构:
ipsum(?:(?!ipsum).)*?amet
(?:(?!ipsum).)*?
检查ipsum
之后和amet
之前的每个位置是否不是其他ipsum
的开头。
使用非贪婪量词*?
,匹配在第一次amet
出现时停止。
请注意,之前的技术需要针对每个位置执行前瞻测试。如果你处理一个长字符串,你也可以使用字符类来提高效率:
ipsum[^ia]*(?:i(?!psum)[^ia]*|a(?!met)[^ia]*)*amet
然而,动态构建此模式并不容易。
当标记是单词(即以单词字符开头和结尾)时,你可以限制使用前瞻测试的位置数量,如下所示:
\bipsum\W+(?:(?!ipsum\b)\w+\W+)*?amet\b
前瞻只在单词开头测试。这个可以很容易地动态构建。