用于匹配重复子字符串的单个 js 正则表达式
single js regex for matching repeating substrings?
>假设我有一个字符串,比如:
where is mummy where is daddy
我想用空字符串替换任何一组重复的子字符串 - 所以在这种情况下,where
和is
元素将被删除,生成的字符串将是:
mummy daddy
我想知道是否有任何单一的正则表达式可以实现这一点。我尝试的正则表达式(不起作用)如下所示:
/('w+)(?=.*)'1/gi
其中第一个捕获组是任何一组单词字符,第二个捕获组是对任何字符集的正面展望(以防止这些字符包含在结果中),然后'1
是对第一个匹配子字符串的反向引用。
任何帮助都会很棒。提前感谢!
您的正则表达式不起作用,因为'w+
不受单词边界的限制,并且'1
反向引用试图在"原始"单词之后进行匹配,这几乎永远不会正确。
您需要首先获取被欺骗的单词,然后构建一个正则表达式以将它们全部与可选的空格(或标点符号等 - 稍后调整模式)匹配并替换为空字符串:
var re = /('b'w+'b)(?=.*'b'1'b)/gi; // Get the repeated whole words
var str = 'where is mummy where is daddy';
var patts = str.match(re); // Collect the matched repeated words
var res = str.replace(RegExp("''s*''b(?:" + patts.join("|") +")''b", "gi"), ""); // Build the pattern for replacing all found words
document.body.innerHTML = res;
第一种模式('b'w+'b)(?=.*'b'1'b)
:
-
('b'w+'b)
- 匹配并捕获由[A-Za-z0-9_]
个字符组成的整个单词到第1组中 -
(?=.*'b'1'b)
- 确保捕获到组 1 中的此值在当前位置右侧的某个位置重复(不一定紧跟在单词之后)。如果字符串是多行的,请使用['s'S]
而不是点。为了确保我们将原始单词和重复单词作为整个单词匹配,应在'w+
和'1
周围使用'b
单词边界。
第二种模式每次看起来都不同,但在当前方案中,它将/'s*'b(?:where|is)'b/gi
:
-
's*
- 零个或多个白蛋白
酶 -
'b(?:where|is)'b
- 交替组(?:...|...)
的整个单词:where
或is
(由于修饰符/i
不区分大小写)。
相关文章:
- 在不破坏未定义函数的情况下,对多个视图使用单个js文件
- 引用单个表的多列 - Sails JS API 模型
- 如何从ng重复单个范围更改父范围 - Angular JS
- 可以't在Angular js/HTML中获取单个记录
- 使用sammy.js和Knockout.js来显示url中的单个项
- 如何根据JavaScript Node.js中的单个值动态拆分数组
- 需要来自单个JS文件的多个子模块与节点/组件.js
- 如何在角度js中以单个形式创建多个组输入类型
- 扩展验证.js并验证单个元素
- Vue.js:如何在单个文件组件中指定道具
- 如何根据URL参数生成包含JS内容的单个HTML文件
- Dropzone.js-上传文件夹结构和单个文件
- 为什么可以't我在highstocks.js中的蜡烛图中获得超过55个条形的单个条形颜色
- 用于匹配重复子字符串的单个 js 正则表达式
- 在使用 GULP 任务将所有 JS 连接到单个 JS 文件中时,在 AngularJS 中出错
- AngularJs 2 在将所有打字稿文件输出生成到单个 js 文件时无法启动
- Typescript模块放到单个JS文件中
- 如何为AWS Lambda nodejs运行时构建单个js文件
- TypeScript 项目组织,编译成单个 JS 文件
- Angular:使用gulp将Angular js文件合并为单个js文件后出现错误