【问题标题】:How to replace an item between two delimiters in TextWrangler如何替换 TextWrangler 中两个分隔符之间的项目
【发布时间】:2011-12-22 00:11:30
【问题描述】:

我想像这样替换音标斜线之间的音标:

/anycharacter*ou*anycharacter/

/anycharacter*au*anycharacter/

我的意思是,在所有情况下,我都想在任意两个拼音斜杠之间用“au”替换“ou”。例如:

<font size=+2 color=#E66C2C> jocose /dʒə'kous/</font>
    =  suj vour ver / suwj dduaf 

进入

<font size=+2 color=#E66C2C> jocose /dʒə'kaus/</font>
    =  suj vour ver / suwj dduaf  
  • 文本文件包含 HTML 代码和一些文本正斜杠(例如 A/B 而不是 A 或 B)
  • 字符串“anycharacter”可以是任何字符,一个或多个字符或没有字符。例如:/folou/、/houl/、/sou/、/dʒə'kousnis/...

到目前为止,我一直在使用:

Find: \/(.*?)\bou*\b(.*?)\/\s
Replace: /\1au\2\3\4/ 

但它会找到任何 /.../ 之间的所有字符串,包括正常的正斜杠和 HTLM 斜杠,并且在替换它时会绕过 /gou/、/tou/ 等项目。和上面的例子一样,输出是:

<font size=+2 color=#E66C2C> jocose /dʒə'kaus/</font>
    =  suj vaur ver / suwj dduaf 

注意:将普通斜线之前的“vour”替换为“vaur”不是我的目的。

您能指导我如何解决上述问题吗?非常感谢。

【问题讨论】:

    标签: regex grep textwrangler


    【解决方案1】:

    可能满足您需求的最简单匹配表达式(符合 POSIX ERE)是:

    (/[^ \t/<>]*?)ou([^ \t/<>]*?/)
    

    分解,这意味着:

    (             # Capture the following into back-reference #1
      /           #   match a literal '/'
      [^ \t<>]    #   match any character that is not a space, tab, slash, or angle bracket...
        *?        #     ...any number of times (even zero times), being reluctant
    )             # end capture
    ou            # match the letters 'ou'
    (             # Capture the following into back-reference #2
      [^ \t/<>]   #   match any character that is not a space, tab, slash, or angle bracket...
        *?        #     ...any number of times (even zero times), being reluctant
      /           #   match a literal '/'
    )             # end capture
    

    然后使用替换表达式\1au\2

    如果/ 字符之间存在空格、制表符、尖括号(&lt;&gt;)或另一个正斜杠(/),这将忽略它们之间的文本。如果您知道其他字符不会出现在这些表达式之一中,请将其添加到字符类([] 组)中

    在我的模拟器中,它变成了这个文本:

    <font size=+2 color=#E66C2C> jocose /dʒə'kous/</font>
        =  suj vour ver / suwj dduaf. 
    Either A/B or B/C might happen, but <b>at any time</b> C/D might also occur
    

    ...进入正文:

    <font size=+2 color=#E66C2C> jocose /dʒə'kaus/</font>
        =  suj vour ver / suwj dduaf. 
    Either A/B or B/C might happen, but <b>at any time</b> C/D might also occur
    

    有什么不懂的就问吧!如果您愿意,我还可以解释您之前尝试使用的那个的一些问题。

    编辑:

    上述表达式匹配整个音标集,并完全替换它,使用匹配的某些部分并替换其他部分。下一场比赛的尝试将在当前比赛之后开始。

    因此,如果ou 可能在/ 分隔的语音表达式中出现多次,则需要多次运行上述正则表达式。对于一次性执行,语言或工具需要同时支持可变长度前瞻和后瞻(统称为环顾)

    据我所知,这只是 Microsoft 的 .Net Regex 和正则表达式的 JGSoft“风味”(在 EditPad Pro 和 RegexBuddy 等工具中)。 POSIX(UNIX grep 需要)不支持任何类型的环视,而 Python(我 THINK TextWrangler 使用)不支持 variable-length 环视。我相信如果没有可变长度的环顾,这是不可能的。

    需要可变长度环视并执行您需要的表达式可能是这样的:

    (?<=/[^ \t/<>]*?)ou(?=[^ \t/<>]*?/)
    

    ...并且替换表达式也需要修改,因为您只匹配(并因此替换)要替换的字符:

    au
    

    除了只匹配ou之外,它的工作原理几乎相同,然后运行检查(称为零宽度断言)以确保它前面紧跟/和任意数量的特定字符,紧接着是任意数量的特定字符,然后是/

    【讨论】:

    • 你是第一!它就像一个魅力。真的非常感谢你!但是,有一个小问题:它一次找到并替换一个实例。例如:/,foulinizou/ 需要两次被替换 - 第一次,它返回 /,faulinizou/。当我再次运行表达式时,它返回 /,faulinizau/。这不是一个大问题,因为我很乐意多次运行该表达式,前提是它可以解决我的问题。它确实解决了我的问题!非常感谢!
    • 我添加了另一种可能性,由于某些语言和正则表达式实现缺乏对“功能”的支持,我担心它在您的情况下不起作用
    • 非常感谢您的更新。我认为 TextWrangler 不支持 variable-length 因为它在运行更新的表达式时会产生搜索错误。错误说:“Grep 模式:lookbehind assertion is not fixed length”。
    猜你喜欢
    • 2020-10-30
    • 2022-01-06
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 2012-06-23
    相关资源
    最近更新 更多