用正则表达式替换第n个单词

时间:2015-10-29 21:21:22

标签: regex

我有一个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}}

请帮忙,谢谢

5 个答案:

答案 0 :(得分:1)

这应该可以解决问题:

^((?:".*?";){6})"(.*?)";"(.*)$

首先捕获的是前六个字段,接下来是第七个字段,第三个捕获是其后的所有字段。

https://regex101.com/r/hV2oS7/2

答案 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修饰符,因为您没有在模式中使用任何字母。当您需要使正则表达式模式不区分大小写时(即匹配EeeE),必须使用不区分大小写的修饰符。

您可以使用

/^("[^"]*"(?:;"[^"]*"){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;
&#13;
&#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}("[^"]*");("[^"]*")

https://regex101.com/r/hL0vD9/1