在一行中查找第n个出现的字符串或子字符串

3
我希望能够找到引号内第三次出现的字符串,以便替换这个字符串或其中一部分。这是我要处理的典型行:

"/activities/absenceactivity/lang/#LANG_ID#/prop_dialog.php";"BA2_PD_SCR";"Opis dogodka";"Event description";"Descrição do Evento";"ÐÐ ¿ и Ñ Ð¿Ð¾Ð´ÑÑ";"";"č®vykio aprašymas";"Descripción del evento";"";

我知道“([^“] *)”显示每个文本和引号的出现,但我想获取第三个,例如在此示例中,“Opis dogodka”,以便在Sublime Text中执行搜索和替换操作。

问题是查找引号内字符串的第三个出现,完全或部分地替换它,并确保正则表达式还提供了一个解决空字符串的方案。

“”

谢谢。


可能是RegEx:匹配第n个出现的重复问题。 - ashwin153
2个回答

1
我相信还有更简单的方法,但如果您可以接受暴力破解:
Sublime 命令:
 Find: "[^"]*";"[^"]*";"([^"]*)".*
 Replace: $1

NP++:

 Find what: "([^"]*)";"([^"]*)";"([^"]*)".*
 Replace with: $3

sed:
 sed 's/"\([^"]*\)";"\([^"]*\)";"\([^"]*\)".*/\3/'

Sublime命令:"[^"]";"[^"]";"([^"]*)".*可以找到整行,但我不知道$1是什么意思。我需要替换第三个引号位置内的特定字符串,有时这是“引号内的整个字符串”,在某些情况下只是一个子字符串,例如只是字符“s”。 - andrej
请注意搜索字符串中的括号。$1表示搜索字符串中第一组括号中的数据。请访问http://www.grymoire.com/Unix/Regular.html#uh-10。 - CoreyJJohnson
@andrej 如果您能写出所需替换结果的示例,可能会有所帮助。 - CoreyJJohnson

0

您可以使用{}模式重复:

/(?:"([^"]*)";){3}/   # first match group will be 'Opis dogodka'

演示

或者,使用全局类型匹配,然后取第三个匹配项。这可能需要像切片或循环等逻辑:

/"([^"]*)";/g

演示2

或者,手动输入前两个模式以跳过:

 /^"[^"]*";"[^"]*";("[^"]*";)/

演示 3

或者将重复组合起来,跳过前n-1个匹配项,然后捕获第n个匹配项:

/^(?:"[^"]*";){2}("[^"]*";)/

演示 4


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接