向后捕获组与前向捕获组连接

时间:2015-08-31 16:00:45

标签: javascript regex

我认为标题说明了一切。我试图让小组联合起来。

我有这样的文字:

GPX 10.802.123/3843­ 1 -­ IDENTIFIER 48

我想要这个输出:

IDENTIFIER 10.802.123/3843-48

所以我想明确地说,我想在这个词之前和之后捕获一个组,然后连接两个,只使用正则表达式。这可能吗?

我已经可以像这样提取48

var text = GPX 10.802.123/3843­ 1 -­ IDENTIFIER 48
var reg = new RegExp('IDENTIFIER' + '.*?(\\d\\S*)', 'i');
var match = reg.exec(text);

输出:

48

可以吗?

我提供200分。

5 个答案:

答案 0 :(得分:3)

你可以这样做:

var text = 'GPX 10.802.123/3843­ 1 -­ IDENTIFIER 48';
var match = /GPX\s+(.+?) \d .*?(IDENTIFIER).*?(\d\S*)/i.exec(text);

var output = match[2] + ' ' + match[1] + '-' + match[3];
//=> "IDENTIFIER 10.802.123/3843­-48"

答案 1 :(得分:3)

您必须精确定义要在单词之前和之后提取的组。如果将单词前面的组定义为四个或更多非空白字符,并将单词后面的组定义为一个或多个非空白字符,则可以使用以下正则表达式。

var re = new RegExp('(\\S{4,})\\s+(?:\\S{1,3}\\s+)*?' + word + '.*?(\\S+)', 'i');
var groups = re.exec(text);
if (groups !== null) {
   var result = groups[1] + groups[2];
}

让我打破正则表达式。请注意,我们必须转义反斜杠,因为我们在字符串中编写正则表达式。

  • (\\S{4,})捕获一组四个或更多非空白字符
  • \\s+匹配一个或多个空白字符
  • (?:表示非捕获组的开始
  • \\S{1,3}匹配一到三个非空白字符
  • \\s+匹配一个或多个空白字符
  • )*?使非捕获组匹配零次或多次,尽可能少次
  • word匹配编译正则表达式时变量word中的任何内容
  • .*?匹配任何字符零次或多次,尽可能少次
  • (\\S+)捕获一个或多个非空白字符
  • 'i'标志使其成为不区分大小写的正则表达式

注意我们使用?修饰符可以让我们在单词之前和之后捕获最近的组。

您可以通过添加g标志在文本中全局匹配正则表达式。下面的代码段演示了如何提取所有匹配项。

function forward_and_backward(word, text) {
  var re = new RegExp('(\\S{4,})\\s+(?:\\S{1,3}\\s+)*?' + word + '.*?(\\S+)', 'ig');
  // Find all matches and make an array of results.
  var results = [];
  while (true) {
    var groups = re.exec(text);
    if (groups === null) {
      return results;
    }
    var result = groups[1] + groups[2];
    results.push(result);
  }
}

var sampleText = "  GPX 10.802.123/3843- 1 -- IDENTIFIER 48   A BC 444.2345.1.1/99x 28 - - Identifier 580 X Y Z 9.22.16.1043/73+ 0  ***  identifier 6800";

results = forward_and_backward('IDENTIFIER', sampleText);
for (var i = 0; i < results.length; ++i) { 
  document.write('result ' + i + ': "' + results[i] + '"<br><br>');
}
body {
  font-family: monospace;
}

答案 2 :(得分:1)

这可以通过替换功能实现。

var s = 'GPX 10.802.123/3843­ 1 -­ IDENTIFIER 48'
s.replace(/.*?(\S+)\s+\d+\s*-\s*(IDENTIFIER)\s*(\d+).*/, "$2 $1-$3")

答案 3 :(得分:1)

^\s*\S+\s*\b(\d+(?:[./]\d+)+)\b.*?-.*?\b(\S+)\b\s*(\d+)\s*$

你可以试试这个。$2 $1-$3。见。演示。

https://regex101.com/r/sS2dM8/38

var re = /^\s*\S+\s*\b(\d+(?:[.\/]\d+)+)\b.*?-.*?\b(\S+)\b\s*(\d+)\s*$/gm; 
var str = 'GPX 10.802.123/3843­ 1 -­ IDENTIFIER 48';
var subst = '$2 $1-$3'; 

var result = str.replace(re, subst);

答案 4 :(得分:0)

您也可以使用拆分:

var text = 'GPX 10.802.123/3843­ 1 -­ IDENTIFIER 48';

var parts = text.split(/\s+/);

if (parts[4] == 'IDENTIFIER') {
    var result = parts[4] + ' ' + parts[1] + '-' + parts[5];
    console.log(result);
}