正则表达式不工作(环视问题)

时间:2018-01-28 23:14:58

标签: regex regex-lookarounds

所以每次我需要一些清晰整洁的东西时,我已经使用Stackoverflow 4年了。

以下是这种情况: 我有一个文本文件,其中有两列由选项卡分隔,第一列是一种语言(例如法语),第二列是英语。

une ampoule \ t灯泡

我希望能够匹配\ t取决于多个因素,用\ t替换它和正确的文章(a / an / the):

  • 由“\ tan”替换,需要在以“un”或“une”开头的行上,\ t后面的单词需要以[aeiou]
  • 开头
  • 被“\ ta”替换为[^ aeuio]
  • 被替换为“\ tthe”需要在行的开头匹配“l'[aeuio]”或“le \ s”或“la \ s”或“les \ s”。

对于第一个选项,我尝试了\t(?=[aeuio][^aeuio]+)(?<=^une|^un),发现notepad ++不支持lookbehinds,并上线了PERC引擎。即使在那里,它也不匹配任何东西。

你能帮帮我吗? 感谢

2 个答案:

答案 0 :(得分:0)

这是一种有效的模式:https://regex101.com/r/burYl1/2

^(une?.*\\t)(\s[^aeiou].*)|^(une?.*\\t)(\s[aeiou].*)|^((?:las?|les?).*\\t)(\s.*)

但是,一次替换所有三个只能在支持增强替换字符串条件的环境中完成(Sublime不支持此操作)。如果是我,我会为每个变化运行三次匹配。

$1 a $2
$3 an $4
$5 the $6

如果您需要替换条件,请告诉我,我会帮您解决。

答案 1 :(得分:0)

您可以使用

^((?:(une?)|(l(?:'[aeuioh]\w*|a|es?)))\h.*\t\h*)(([aeiou])|((?![aeiou])[a-z]))

并替换为$1(?{2}(?{6} a $6: an $5):(?{3}the $4))确保未选中 Match Case

<强>详情

  • ^ - 行的开头
  • ( - 第1组开始:
    • (?:(une?)|(l(?:'[aeuioh]\w*|a|es?))) - 两种选择中的任何一种:
      • (une?) - 第2组:unune
      • (l(?:'[aeuioh]\w*|a|es?)) - 第3组:l后跟'和0+字词,或laleles
    • \h - 水平空间
    • .* - 除了换行符之外的任何0 +字符,尽可能多
    • \t - TAB char
    • \h* - 0+水平空格
  • ) - 第1组结束
  • (([aeiou])|((?![aeiou])[a-z])) - 第4组匹配两个替代方案:
    • ([aeiou]) - 第5组:元音
    • | - 或
    • ((?![aeiou])[a-z]) - 第6组:辅音(除aeiou之外的任何字符

替换模式详情

  • $1 - 在此处插入第1组值
  • (?{2} - 如果第2组匹配
    • (?{6} - 如果第6组匹配
      • a $6 - 插入空格,a,空格和第6组(辅音)值
      • : - 其他
      • an $5 - 插入空格,an,空格和第5组(元音)值
    • ) - 条件构造的结束
    • : - 其他
    • (?{3} - 如果第3组匹配
      • the $4 - 插入the,空格和第4组值
    • ) - 条件构造的结束
  • ) - 条件构造的结束