我认为标题说明了一切。我试图让小组联合起来。
我有这样的文字:
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分。
答案 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);
}