我想捕获只有一个正则表达式的四个组。
我有这段文字:
validate_unique/3
我希望得到钥匙后面的数字:
unique_constraint/3
我只能使用一个正则表达式,所以我尝试了这种方法:
PAY VALUES TO SUM - WITHOU NOTHING: 0.00 (IGNORE THE REST)
PAY VALUES TO SUM - ADD. 50 YEARS: 0.00 (IGNORE THE REST)
PAY VALUES TO SUM - ADD. 70 YEARS: 0.00 (IGNORE THE REST)
PAY VALUES TO SUM - ADD. 80 YEARS: 0.00 (IGNORE THE REST)
结果是PAY VALUES TO SUM - WITHOU NOTHING:
PAY VALUES TO SUM - ADD. 50 YEARS:
PAY VALUES TO SUM - ADD. 70 YEARS:
PAY VALUES TO SUM - ADD. 80 YEARS:
。
这是我尝试使用的正则表达式:
var text = 'PAY VALUES TO SUM - WITHOU NOTHING: 0.00 13º WORD WORD: 0.00' +
text += 'PAY VALUES TO SUM - ADD. 50 YEARS: 0.00 WORD WORD WORD: 0.00';
text += 'PAY VALUES TO SUM - ADD. 70 YEARS: 0.00 WORD WORD WORD: 0.00';
text += 'PAY VALUES TO SUM - ADD. 80 YEARS: 0.00 WORD WORD WORD WORD WORD WORD WORD: 0.00';
var reg = new RegExp(SOME REGEX);
var match = reg.exec(text);
console.log(match[1], match[2], match[3], match[4]);
我的想法是在我可以传入的单词或数字之后捕获组。
但显然这是无效的。我怎样才能实现目标?
有时数字会发生变化。它们并非总是0.00 0.00 .00 .00
。
我需要明确传递单词的名称和捕获组。由于文字很大,我只在上面展示了部分内容。
我有另外一个可以做我正在尝试的正则表达式,但是有另一个文本:
new RegExp('PAY VALUES TO SUM - WITHOU NOTHING:' + '\\b.*?(?:\\d\\S*\\s+){1}(\\d\\S*)(?:\\s?\\d\\S*\\s+){14}(\\d\\S*)(?:\\s?\\d\\S*\\s+){14}(\\d\\S*)(?:\\s?\\d\\S*\\s+){29}(\\d\\S*)(?:\\s?\\d\\S*\\s+){41}(\\d\\S*)');
在这种情况下,我传递了“PREV SOC 01”字样。和两个捕获组,一个捕获0.00
,另一个捕获var text = 'PREV SOC 01 672 1.653.806,08 18.512,98 1.667.621,57 2.647,38 07 23 12.965,11 0,00 12.965,11 0,00'
var reg = new RegExp('PREV SOC 01' + '\\b.*?(?:\\d\\S*\\s+){4}(\\d\\S*)(?:\\s?\\d\\S*\\s+){5}(\\d\\S*)', 'i');
var match = reg.exec(text);
console.log(match[1]);
console.log(match[2]);
。
我在其他文字中也需要相同的内容:
1.667.621,57
我想传递0,00
并在数字和数字后选择我想要的内容。
答案 0 :(得分:1)
您只需要捕获0.00
之类的双号,这就是您需要的正则表达式(\d.\d{2})
:
var text = 'PAY VALUES TO SUM - WITHOUT NOTHING: 0.13 13º WORD WORD: 0.00';
text += 'PAY VALUES TO SUM - ADD. 50 YEARS: 3.85 WORD WORD WORD: 0.00';
text += 'PAY VALUES TO SUM - ADD. 70 YEARS: 9.02 WORD WORD WORD: 0.00';
text += 'PAY VALUES TO SUM - ADD. 80 YEARS: 5.21 WORD WORD WORD WORD WORD WORD WORD: 0.00';
var re = /(\d.\d{2})/g;
var m;
while ((m = re.exec(text)) !== null) {
if (m.index === re.lastIndex) {
re.lastIndex++;
}
document.write(m[0]+" ");
}
这是 regex101 DEMO 。
注意: 我仅将document.write()
用于测试,避免使用它。
这是第二次尝试得到你需要的新的正则表达式(PAY VALUES TO SUM - (?:WITHOU NOTHING|ADD. \d{2} YEARS): (\d.\d{2}))
,我希望它是你正在寻找的:
var text = 'PAY VALUES TO SUM - WITHOU NOTHING: 0.13 13º WORD WORD: 0.00';
text += 'PAY VALUES TO SUM - ADD. 50 YEARS: 3.85 WORD WORD WORD: 0.00';
text += 'PAY VALUES TO SUM - ADD. 70 YEARS: 9.02 WORD WORD WORD: 0.00';
text += 'PAY VALUES TO SUM - ADD. 80 YEARS: 5.21 WORD WORD WORD WORD WORD WORD WORD: 0.00';
var re = /(PAY VALUES TO SUM - (?:WITHOU NOTHING|ADD. \d{2} YEARS): (\d.\d{2}))/g;
var m;
while ((m = re.exec(text)) !== null) {
if (m.index === re.lastIndex) {
re.lastIndex++;
}
document.write(m[0] + "<br>");
}
答案 1 :(得分:1)
以下是我对您的问题的解释:
var a = 1;
function hello() {
var a = 3;
(function() {
alert(a);
}());
}
hello(); //alerts 3
答案 2 :(得分:0)
如果我理解正确,您只需要在每行:
之后的每个xx.xx号码的第一次出现,因为数字也可能在第一次出现后发生。
如果是这种情况,那么这是你的正则表达式:
/^.*?:\s*([\d\.]+).*/gm
答案 3 :(得分:0)
首先将您的密钥放入数组:
var keys = [
'PAY VALUES TO SUM - WITHOU NOTHING:',
'PAY VALUES TO SUM - ADD. 50 YEARS:',
'PAY VALUES TO SUM - ADD. 70 YEARS:',
'PAY VALUES TO SUM - ADD. 80 YEARS:'
];
现在编译一个正则表达式,在每个键后面查找一个数字。您可以使用[0-9.]+
来匹配课程[0-9.]
中一个或多个字符的序列,其中包含数字0
到9
和.
(期)。这足以匹配看起来像0.00
和314.159
的数字。
这是一个正则表达式,使用[0-9.]+
在每个键后提取一个数字:
var regex = RegExp(keys[0] + '\\s+([0-9.]+).*?' +
keys[1] + '\\s+([0-9.]+).*?' +
keys[2] + '\\s+([0-9.]+).*?' +
keys[3] + '\\s+([0-9.]+).*?', 'gi');
请注意\\s+
匹配每个键后的一个或多个空格。如果要匹配零个或多个空格,可以将其更改为\\s*
。
我们正在使用.*?
来匹配下一个键之前最短的字符序列。 'gi'
标志使正则表达式全局匹配(g
),而不考虑大小写(i
)。
在执行正则表达式之前,最好用可见空格替换所有不可见的空格。这是因为.*
与行尾字符不匹配。
text = text.replace(/\s/g, ' ');
下面的代码段演示了此方法,其中包含您在问题中提供的示例文本和密钥。
function print(s) {
document.write(s + '<br />');
}
var keys = [
'PAY VALUES TO SUM - WITHOU NOTHING:',
'PAY VALUES TO SUM - ADD. 50 YEARS:',
'PAY VALUES TO SUM - ADD. 70 YEARS:',
'PAY VALUES TO SUM - ADD. 80 YEARS:'
];
// Compile a regular expression that looks for a number after each key.
var regex = RegExp(keys[0] + '\\s+([0-9.]+).*?' +
keys[1] + '\\s+([0-9.]+).*?' +
keys[2] + '\\s+([0-9.]+).*?' +
keys[3] + '\\s+([0-9.]+).*?', 'gi');
var text = document.getElementById('content').innerHTML;
// Replace newlines and other invisible whitespace with visible spaces.
text = text.replace(/\s/g, ' ');
// Find and display all matches.
var count = 0;
while (true) {
var match = regex.exec(text);
if (match === null) {
break;
}
++count;
print('match ' + count + ': ' +
[match[1], match[2], match[3], match[4]].join(' '));
}
&#13;
body {
font-family: sans-serif;
}
#content {
display: none;
}
&#13;
<div id="content">
PAY VALUES TO SUM - WITHOU NOTHING: 0.00 13º WORD WORD: 0.00
PAY VALUES TO SUM - ADD. 50 YEARS: 0.00 WORD WORD WORD: 0.00
PAY VALUES TO SUM - ADD. 70 YEARS: 0.00 WORD WORD WORD: 0.00
PAY VALUES TO SUM - ADD. 80 YEARS: 0.00 WORD WORD WORD WORD WORD WORD WORD: 0.00
</div>
&#13;
答案 4 :(得分:0)
试试这个:你可以使用这个简短的正则表达式:/PAY\s+VALUES\s+TO\s+SUM\s+[^:]+:\s*([\d.]+)/gmi
<强> Regex demo 强>
var re = /PAY\s+VALUES\s+TO\s+SUM\s+[^:]+:\s*([\d.]+)/gmi;
var str = 'var text = \'PAY VALUES TO SUM - WITHOU NOTHING: 0.00 13º WORD WORD: 0.00\' +\ntext += \'PAY VALUES TO SUM - ADD. 50 YEARS: 0.00 WORD WORD WORD: 0.00\';\ntext += \'PAY VALUES TO SUM - ADD. 70 YEARS: 0.00 WORD WORD WORD: 0.00\';\ntext += \'PAY VALUES TO SUM - ADD. 80 YEARS: 0.00 WORD WORD WORD WORD WORD WORD WORD: 0.00\';\n';
var m;
while ((m = re.exec(str)) !== null) {
if (m.index === re.lastIndex) {
re.lastIndex++;
}
// View your result using the m-variable.
document.write(m[1]+ ' ');
}
&#13;