我有这段文字:
'BASE CÁL PREV SOC BASE CÁL 13º 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 13 5 10.517,81 0,00 10.517,81 0,00 TOTAIS: 700 1.677.289,00 18.512,98 1.691.104,49 2.647,38'
没有替换空格和换行的原格式是:
NUMBER OTHER OTHER OTHER BASE CÁL PREV SOC BASE CÁL 13º PREV SOC
01 672 1.653.806,09 18.512,98 1.667.621,57 2.647,38
07 23 12.965,11 0,00 12.965,11 0,00
13 05 10.517,87 0,00 10.517,81 0,00
TOTAL: 700 1.677.289,00 18.512,98 1.691.104,49 2.647,38
我只想提取 BASE CÁL PREV SOC 列中第 01 和 07 行的信息,但有时 07 不存在。第 13 行将被忽略。
所以我想在一个正则表达式中包含给定的短语和匹配组。
需要说明的是,这些数据位于一个巨大的文本中,因此正则表达式不能通用。我必须明确传递一个接近数字的独特短语。这里选择的短语是 'BASE CÁL PREV SOC BASE CÁL 13º PREV SOC'。我只想得到 01 和 07 中的数字(虽然有时 07 不会存在),而忽略 13。
更清楚一点,在当前示例中,我希望结果为 1.667.621.57 和 12.965,11。
我有这个代码:
var text = 'BASE CÁL PREV SOC BASE CÁL 13º 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 13 5 10.517,81 0,00 10.517,81 0,00 TOTAIS: 700 1.677.289,00 18.512,98 1.691.104,49 2.647,38';
var reg = new RegExp('BASE CÁL PREV SOC BASE CÁL 13º PREV SOC' + '\\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]);
我要确定数字是01和07,如果没有07就用00,00替换。
这可能吗?
最佳答案
要匹配文本中可能不会出现的组,请在组末尾使用 ? 修饰符,如下所示:
'(?:.*?\\s+07(?:\\s+\\S+){3}\\s+(\\S+))?'
在您的案例中,完整的正则表达式如下所示:
var re = RegExp('BASE CÁL PREV SOC BASE CÁL 13º PREV SOC' +
'.*?\\s+01(?:\\s+\\S+){3}\\s+(\\S+)' +
'(?:.*?\\s+07(?:\\s+\\S+){3}\\s+(\\S+))?');
正则表达式定义的第一部分是您要查找的短语。让我们分解第二部分:
.*? 尽可能少地匹配零个或多个任何类型的字符(行终止字符除外)\\s+ 匹配一个或多个空白字符01匹配行号(?:\\s+\\S+) 是一个非捕获组,匹配一个或多个空白字符后跟一个或多个非空白字符{3} 使 (?:\\s+\\S+) 组匹配三次\\s+ 匹配一个或多个空白字符(\\S+) 捕获一个或多个非空白字符——这就是我们正在寻找的值正则表达式的第三部分与第二部分类似,只是它有 07 而不是 01,而且最重要的是,它包含在一个非捕获的,可选组。
(?: 开始一个非捕获组)? 结束组并使其可选重要的是组的右括号后的?。此 ? 使整个组成为可选的:它可能匹配也可能不匹配。该组不一定非捕获。如果我们在左括号后省略 ?:,正则表达式仍然有效,只是我们必须使用 match[3] 从 中提取值07 行。
执行正则表达式后,匹配失败的组的值为undefined。您可以像这样替换您选择的值:
var value07 = match[2] || '0,00';
在下面的代码片段中,尝试用 08 替换内容中的 07 看看会发生什么。
var text = document.getElementById('content').innerHTML;
// Replace all whitespace with visible spaces.
text = text.replace(/\s+/g, ' ');
var re = RegExp('(?:.*BASE CÁL PREV SOC BASE CÁL 13º PREV SOC)+' +
'(?:.*?\\s+01(?:\\s+\\S+){3}\\s+(\\S+))?' +
'(?:.*?\\s+07(?:\\s+\\S+){3}\\s+(\\S+))?');
var match = re.exec(text),
value01 = match[1] || '0,00',
value07 = match[2] || '0,00';
document.write(value01 + '<br><br>');
document.write(value07 + '<br><br>');body {
font-family: sans-serif;
}
#content {
color: #888;
margin: 20px 0;
display: none;
}<div id="content">
NUMBER OTHER OTHER OTHER BASE CÁL PREV SOC BASE CÁL 13º PREV SOC
01 672 1.653.806,09 18.512,98 1.111.111,11 2.647,38
07 23 12.965,11 0,00 11.111,11 0,00
13 05 10.517,87 0,00 10.517,81 0,00
TOTAL: 700 1.677.289,00 18.512,98 1.691.104,49 2.647,38
NUMBER OTHER OTHER OTHER BASE CÁL PREV SOC BASE CÁL 13º PREV SOC
01 672 1.653.806,09 18.512,98 2.222.222,22 2.647,38
07 23 12.965,11 0,00 22.222,22 0,00
13 05 10.517,87 0,00 10.517,81 0,00
TOTAL: 700 1.677.289,00 18.512,98 1.691.104,49 2.647,38
NUMBER OTHER OTHER OTHER BASE CÁL PREV SOC BASE CÁL 13º PREV SOC
01 672 1.653.806,09 18.512,98 3.333.333,33 2.647,38
07 23 12.965,11 0,00 33.333,33 0,00
13 05 10.517,87 0,00 10.517,81 0,00
TOTAL: 700 1.677.289,00 18.512,98 1.691.104,49 2.647,38
</div>
关于javascript - 用正则表达式捕获两组数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32465952/
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非
@raw_array[i]=~/[\W]/非常简单的正则表达式。当我用一些非拉丁字母(具体来说是俄语)尝试时,条件是错误的。我能用它做什么? 最佳答案 @raw_array[i]=~/[\p{L}]/使用西里尔字符进行测试。引用:http://www.regular-expressions.info/unicode.html#prop 关于ruby-正则表达式将非英文字母匹配为非单词字符,我们在StackOverflow上找到一个类似的问题: https://
我正在尝试使用ruby编写一个双线程客户端,一个线程从套接字读取数据并将其打印出来,另一个线程读取本地数据并将其发送到远程服务器。我发现的问题是Ruby似乎无法捕获线程内的错误,这是一个示例:#!/usr/bin/rubyThread.new{loop{$stdout.puts"hi"abc.putsefsleep1}}loop{sleep1}显然,如果我在线程外键入abc.putsef,代码将永远不会运行,因为Ruby将报告“undefinedvariableabc”。但是,如果它在一个线程内,则没有错误报告。我的问题是,如何让Ruby捕获这样的错误?或者至少,报告线程中的错误?
我需要一个非常简单的字符串验证器来显示第一个符号与所需格式不对应的位置。我想使用正则表达式,但在这种情况下,我必须找到与表达式相对应的字符串停止的位置,但我找不到可以做到这一点的方法。(这一定是一种相当简单的方法……也许没有?)例如,如果我有正则表达式:/^Q+E+R+$/带字符串:"QQQQEEE2ER"期望的结果应该是7 最佳答案 一个想法:你可以做的是标记你的模式并用可选的嵌套捕获组编写它:^(Q+(E+(R+($)?)?)?)?然后你只需要计算你获得的捕获组的数量就可以知道正则表达式引擎在模式中停止的位置,你可以确定匹配结束
我在使用自定义RailsFormBuilder时遇到了问题,从昨天晚上开始我就发疯了。基本上我想对我的构建器方法之一有一个可选block,以便我可以在我的主要content_tag中显示其他内容。:defform_field(method,&block)content_tag(:div,class:'field')doconcatlabel(method,"Label#{method}")concattext_field(method)capture(&block)ifblock_given?endend当我在我的一个Slim模板中调用该方法时,如下所示:=f.form_field:e
我想从then子句中访问case语句表达式,即food="cheese"casefoodwhen"dip"then"carrotsticks"when"cheese"then"#{expr}crackers"else"mayo"end在这种情况下,expr是食物的当前值(value)。在这种情况下,我知道,我可以简单地访问变量food,但是在某些情况下,该值可能无法再访问(array.shift等)。除了将expr移出到局部变量然后访问它之外,是否有直接访问caseexpr值的方法?罗亚附注我知道这个具体示例很简单,只是一个示例场景。 最佳答案
这是一个例子:s="abcd+subtext@example.com"s.match(/+[^@]*/)Result=>"+subtext"问题是,我不想在其中包含“+”。我希望结果是“潜台词”,没有+ 最佳答案 您可以在正则表达式中使用括号来创建匹配组:s="abcd+subtext@example.com"s=~/\+([^@]*)/&&$1=>"subtext" 关于ruby-正则表达式-排除一个字符,我们在StackOverflow上找到一个类似的问题:
我们有一个字符串:“”这个正则表达式://i如何从当前字符串中获取所有匹配项? 最佳答案 "".scan(//)参见scan在ruby-docs上 关于ruby-如何遍历Ruby中所有正则表达式匹配的字符串?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6857852/