带有模式的正则表达式字符串
Regex string with pattern
对于正则表达式粉丝...我有的是这个字符串:
"Lorem ipsum dolor FOO IO BAR BA"
我想提取标题和大写后缀数组:
-
"Lorem ipsum dolor"
-
["FOO", "IO", "BAR", "BA"]
这是我的尝试:
function retrieveGroups( string )
{
var regexp = new RegExp(/(FOO|BAR|BA|IO)/g);
var groups = string.match( regexp ) || [];
var title = string.replace( regexp, "" );
return {title:title, groups:groups};
}
结果在:
title : "Lorem ipsum dolor ",
groups : ["FOO" , "IO", "BAR", "BA"]
这很好,但它不会阻止这种情况:
LoremFOO ipBAsum IO dolor FOO
在该 CAS 中,我只需要在结果组中["FOO"]
。
规则似乎很简单...
获取标题。
标题可以全部大写("LOREM IPSUM")。
获取大写后缀数组。
Grouops (FOO,BAR,IO,BA) 可能不存在于字符串中。
如果不是,则不要匹配后缀:后缀且不由空格
引导从字符串末尾开始匹配(如果可能?),因此如果遇到重复的组参数,请不要匹配(上面的问题示例)
我也尝试string.replace(regexp, function(val) ....
但我不确定它有什么帮助......
不知道它是否有帮助,但小提琴在这里。谢谢!
获取
大写后缀数组。
> "Lorem ipsum dolor FOO IO BAR BA".match(/'b[A-Z]+'b(?!'s+'S*[^A-Z's]'S*)/g)
[ 'FOO',
'IO',
'BAR',
'BA' ]
> "LoremFOO ipBAsum IO dolor FOO".match(/'b[A-Z]+'b(?!'s+'S*[^A-Z's]'S*)/g)
[ 'FOO' ]
获取标题数组。
> "LoremFOO ipBAsum IO dolor FOO".match(/^.*?(?='s*'b[A-Z]+'b(?:'s+[A-Z]+'b|$))/g)
[ 'LoremFOO ipBAsum IO dolor' ]
> "Lorem ipsum dolor FOO IO BAR BA".match(/^.*?(?='s*'b[A-Z]+'b(?:'s+[A-Z]+'b|$))/g)
[ 'Lorem ipsum dolor' ]
更新:
> "LoremFOO ipBAsum IO dolor FOO".match(/'b(?:FOO|BAR|BA|IO)'b(?!'s+'S*[^A-Z's]'S*)/g)
[ 'FOO' ]
-
'b
称为单词边界,它在单词字符和非单词字符之间匹配。 (?:FOO|BAR|BA|IO)'b
匹配FOO
或BAR
或BA
或IO
以及以下单词边界,
仅当它后面没有一个或多个空格字符、零个或多个非空格字符以及空格或大写字母以外的字符,再次后跟零个或多个非空格字符时,才
(?!'s+'S*[^A-Z's]'S*)
。因此,这对IO
失败,因为它后跟一个包含至少一个小写字母的单词。(?!...)
称为否定前瞻断言。
> "Lorem ipsum dolor FOO IO BAR BA".match(/'b(?:FOO|BAR|BA|IO)'b(?!'s+'S*[^A-Z's]'S*)/g)
[ 'FOO',
'IO',
'BAR',
'BA' ]
而且,您也可以使用基于前瞻性的正则表达式。 (?=....)
称之为积极的前瞻性断言。
> "LoremFOO ipBAsum IO dolor FOO".match(/'b(?:FOO|BAR|BA|IO)'b(?='s+(?:FOO|BAR|BA|IO)'b|$)/g)
[ 'FOO' ]
获取标题数组。
> "Lorem ipsum dolor FOO IO BAR BA".match(/^.*?(?='s*'b(?:FOO|BAR|BA|IO)'b(?:'s+(?:FOO|BAR|BA|IO)'b|$))/g)
[ 'Lorem ipsum dolor' ]
> "LoremFOO ipBAsum IO dolor FOO".match(/^.*?(?='s*'b(?:FOO|BAR|BA|IO)'b(?:'s+(?:FOO|BAR|BA|IO)'b|$))/g)
[ 'LoremFOO ipBAsum IO dolor' ]
也许这就是你要找的:
function retrieveGroups( string )
{
var regexp = new RegExp(/^(.*?)'s*([ A-Z]+)*$/);
var result = string.match( regexp ) || [];
var title = result[1];
var groups=result[2].split(" ");
return {title:title, groups:groups};
}
编辑:这是一组固定大写单词的解决方案:
function retrieveGroups( string )
{
var regexp = new RegExp(/^(.*?)'s*((?:'s|FOO|BAR|IO|BA)+)?$/);
var result = string.match( regexp ) || [];
var title = result[1];
var groups=result[2].split(" ");
return {title:title, groups:groups};
}
通过使用Avinash的RegEx,可以提取所有有效的后缀。标题将是第一个后缀之前的所有文本。所以最终的 JavaScript 代码将如下所示:
var arr = ['Lorem ipsum dolor FOO IO BAR BA', 'LoremFOO ipBAsum IO dolor FOO']
arr.forEach(function(str) {
var o = retrieveGroups(str);
alert("Parsed title = " + o.title + ", groups=" + o.groups);
});
function retrieveGroups( string ) {
var regex = /'b(?:FOO|BAR|BA|IO)'b(?='s+(?:FOO|BAR|BA|IO)'b|$)/g
var groups = string.match( regex ) || [];
var title = string.replace( regex, '').trim();
return {'title':title, 'groups':groups};
}
这是演示
相关文章:
- 将电子邮件验证正则表达式字符串存储在JSON中
- 带有模式的正则表达式字符串
- Javascript if数组包含正则表达式字符串
- 在JSON中指定正则表达式字符串,在JavaScript和PHP中使用
- 从正则表达式文本中获取正则表达式字符串表示的最佳方式
- 正则表达式 - 字符串不能以空格开头,以空格结尾,并且连续包含几个空格
- 正则表达式 - 字符串不应包含超过 7 位数字
- 在 javascript 中将正则表达式字符串转换为正则表达式不同
- Javascript:测试单个字符在正则表达式字符串中找到
- 正则表达式(字符串比较)
- 是否可以生成与正则表达式字符串匹配的字符串
- 正则表达式字符串匹配
- 正则表达式字符串比较忽略符号
- 是否可以使用正则表达式解析正则表达式字符串
- 正则表达式字符串在文档中替换为 JavaScript
- 如何使正则表达式字符串拒绝空白字段
- 拆分正则表达式字符串
- 表示正则表达式字符串表示法
- 将HTML标记添加到此正则表达式字符串中
- 将正则表达式字符串转换为javascript中的正则表达式对象