我有一个csv文件,我需要更改第7和第8个" cell"使用列表中的值。我试图用正则表达式替换,但我在定义正则表达式时遇到了问题。
我尝试了(\"\w+\").*?(\"\w+\"){7}
但没有数字,正则表达式附加了2个单元格。
(?:[^\"]\w+\")
离开第一个"背后。
(\"\w+\")?(\"\w+\")
匹配每个单元格。
我需要的是以下一行:
" B34&#34 ;;" ES&#34 ;;" EE&#34 ;;"啤酒&#34 ;;"啤酒&#34 ;;&# 34; 34421&#34 ;;"再见&#34 ;;"双向&#34 ;;" buuu&#34 ;;" fffs"
获取第{7}个字{/ 1}}
请帮忙,谢谢
答案 0 :(得分:1)
这应该可以解决问题:
^((?:".*?";){6})"(.*?)";"(.*)$
首先捕获的是前六个字段,接下来是第七个字段,第三个捕获是其后的所有字段。
答案 1 :(得分:1)
利用您的数据来简化正则表达式:
/([^;]+;){6}"([^"]+)"/
现在$2
有 bye
答案 2 :(得分:1)
你的正则表达式不起作用,因为:
(\"\w+\").*?(\"\w+\"){7}
- 匹配"
,1个或多个字母数字,"
,然后0或更多(但尽可能少)除换行符之外的任何字符,然后发生7次引用的字母数字字符串。很明显,你将通过这个正则表达式超过第7个值(因为你已经要求匹配8)。(?:[^\"]\w+\")
- 匹配1个字符"
([^"]
},然后是1个或多个字母数字(\w+
),然后是"
。很明显,这个只匹配1个字段,没有空格。(\"\w+\")?(\"\w+\")
- 这匹配1或0引用的字母数字子字符串,然后引用1个字母数字字符串。再说一遍,这不会让你进入第7场。请注意,您不需要/i
修饰符,因为您没有在模式中使用任何字母。当您需要使正则表达式模式不区分大小写时(即匹配E
和e
与e
或E
),必须使用不区分大小写的修饰符。
您可以使用
/^("[^"]*"(?:;"[^"]*"){5};)"[^"]*"/
或者,进一步收缩(因为;
总是在右边):
/^((?:"[^"]*";){6})"[^"]*"/
正则表达式匹配
^
- 字符串开头((?:"[^"]*";){6})
- (捕获组1) - 恰好6次出现(由于限制量词{6}
)"..."
- 类似于引用的子串,后跟;
"[^"]*"
- 引用的子字符串,其内部没有"
(第7个字段值)。这是一个有效的JS片段:
$("#button").click(function() {
var line = '"b34";"es";"ee";"beer";"beers";"34421";"bye";"bi";"buuu";"fffs"';
var regex = /^((?:"[^"]*";){6})"[^"]*"/;
var result = line.replace(regex, '$1"hello"');
$("#result").val(result);
});

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>
<div id="palabra">"b34";"es";"ee";"beer";"beers";"34421";"bye";"bi";"buuu";"fffs"</div><br/>
<div>
<input type="text" id="result" value="" style="width:400px;"/>
</div><br/>
<div id="palabra">Expected: "b34";"es";"ee";"beer";"beers";"34421";"hello";"bi";"buuu";"fffs"</div><br/>
<button id="button" >Run regex</button>
&#13;
答案 3 :(得分:1)
好的,我对你的正则表达式进行了修改并替换了函数。
for (int i = 0; i < comb.codigo.length; i++) {
if(clave.contains(comb.codigo[i])){
aciert++;
clave.remove(Character.valueOf(comb.codigo[i]));
}
}
var regex = /^((?:"[^"]*";){6})"[^"]*"/i;
var result = line.replace(regex, '$1' + replacement);
匹配第一个捕获组,即前六个单元格中的所有内容。
在这里试试:
https://jsfiddle.net/L19ru04s/
这是模式:
$1
https://regex101.com/r/lR5xU5/1
它会查找六次^((?:"[^"]*";){6})"[^"]*"
次,并将它们放入捕获组,然后在捕获组的外部之后捕获下一个单元格。这样,当我们替换前七个单元格时,我们可以使用前六个单元格的捕获组来保持它们。
答案 4 :(得分:0)
您希望捕获在其之前有6个未捕获的"..."
实例发生的"...";
:
(?:"[^"]*";){6}("[^"]*")
要单独捕获第8个,将6更改为7,或者捕获第7个和第8个:
(?:"[^"]*";){6}("[^"]*");("[^"]*")