正则表达式模式在另一个模式中的任何地方

时间:2019-07-18 14:34:43

标签: javascript regex

我需要找到一个模式,该模式中的任何地方都可以有另一个固定模式。

示例:

Looking for pattern: "HERE"    
This pattern can also have one or multiple times the pattern "##" in it.    

以下条目应匹配:

"A match is expected HE##RE"    
"... also H##ER##E ..."    
"... and the basic one HERE  ..."    

我试图做一些预先计算的事情,以删除这些不需要的“ ##”,但这是不可接受的,因为某些信息可能会丢失,例如本例所示:

"This is important ##and the match is only HER##E"    

我还考虑过在预过滤计算之前对所有##进行索引,然后使用索引重建平均值,但是我认为这不是最佳解决方案。

是否有人有一些正则表达式提示或想法?
谢谢大家。

3 个答案:

答案 0 :(得分:2)

您可以使用可选组(?:##)?并使用单词边界\b来防止匹配项成为较大单词的一部分:

\bH(?:##)?E(?:##)?R(?:##)?E\b

Regex demo

动态创建的一种选择可能是使用拆分和连接:

let d = "(?:##)?";
let word = "\\b" + "HERE".split('').join(d) + "\\b";
let str = "A match is expected HE##RE";
let pattern = new RegExp(word, 'gi');
console.log(pattern);
console.log(str.match(pattern));

答案 1 :(得分:1)

这似乎很复杂;假设我们正在寻找带有额外字符(例如#)的单词(带有顺序),我猜测也许是这个表达式

library(dplyr)
library(ggplot2)
df %>% 
  mutate(B=as.factor(B)) %>% 
 ggplot(aes(C)) + stat_ecdf(aes(color=B), geom='step')

可能是一个开始,在这种情况下会失败:

(?=.*(?<=\s|^)(H\S*E\S*R\S*E)(?=\s|$)).*

如果需要的话。

DEMO 1

我们可以将其简化为:

Anything before then #HERE
Anything before then HERE#

但这将传递任何内容,而不仅仅是文字。

DEMO 2

如果要浏览/简化/修改该表达式,请在this demo的右上角进行解释。

答案 2 :(得分:0)

let s = `A match is expected HE##RE
... also H##ER##E ...    
"... and the basic one HERE  ...`;

console.log(s.match(/\bH#*E#*R#*E\b/g))