带有模式的正则表达式字符串

Regex string with pattern

本文关键字:正则表达式 字符串 模式      更新时间:2023-09-26

对于正则表达式粉丝...我有的是这个字符串:

"Lorem ipsum dolor FOO IO BAR BA"

我想提取标题和大写后缀数组:

  1. "Lorem ipsum dolor"
  2. ["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匹配FOOBARBAIO以及以下单词边界,

  • 仅当它后面没有一个或多个空格字符、零个或多个非空格字符以及空格或
  • 大写字母以外的字符,再次后跟零个或多个非空格字符时,才(?!'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};
}

这是演示