代码之家  ›  专栏  ›  技术社区  ›  Jay

文本读取和替换算法

  •  0
  • Jay  · 技术社区  · 16 年前

    看看这个:

    MENU_ITEM_BACK#0="Back";
    MENU_ITEM_BLOCK_CHANNEL#0="Block";
    MENU_ITEM_CLOSE#0="Close";
    MENU_ITEM_DETAILS#0="Details";
    MENU_ITEM_DIAGNOSE#0="Diagnose";
    MENU_ITEM_DOWNLOAD#0="Download";
    

    …等等(超过500行)。将标签名称自动复制到标签本身的最佳方法是什么?例如,

    MENU_ITEM_BACK#0="Back";
    

    将成为

    MENU_ITEM_BACK#0="MENU_ITEM_BACK";
    

    我最熟悉Java,但对任何其他编程语言都没有异议,尽管我对正则表达式(至少是编码的)并不十分熟悉。

    编辑:我注意到,0='并不总是常数。有时它们可以被一个非常任意的数字代替,例如“6548135=”。给出的答案很好,但是由于我不熟悉正则表达式,您将如何适应这种情况?请注意,我不想复制号码,只想复制标签。

    4 回复  |  直到 16 年前
        1
  •  1
  •   xpda    16 年前

    您可以在不使用正则表达式的情况下使用Microsoft Word执行此操作。将代码部分复制到Word中。然后使用列选择(按住alt键并用鼠标选择),然后将其复制到右侧,然后使用搜索和替换进行清除。

        2
  •  2
  •   R. Martinho Fernandes    16 年前

    我认为正则表达式是一个不错的选择,假设标签不能有任何 # 字符。简单替换

    ^([^#]+#0)=".*";$
    

    具有

     \1="\1";
    

    如果要在程序或脚本中执行此操作,则需要使用所选语言的regex工具。

    如果只想对此特定文件执行一次此操作,可以使用sed执行此操作:

    $ sed -e "s/^([^#]+#0)=".*";$/\1=\"\1\"/" file
    
        3
  •  1
  •   Paul Chernoch    16 年前

    使用正则表达式搜索和替换,如Perl、Sed、Awk或许多最近的文本编辑器中支持的。

    在Perl中,这将实现以下技巧:

    my $text = <<END_YOUR_TEXT;
    PUT YOUR TEXT HERE
    END_YOUR_TEXT
    $text =~ s/(MENU_ITEM_[^#]+)#0="[^"]+";/$1#0="$1";/g
    print $text;
    

    “$1”是对括号匹配的引用,例如菜单项\返回。

    要从命令行中的文件中读取文本,请将其放入:

    我的$text=<>;

        4
  •  1
  •   Mark Byers    16 年前

    正则表达式,例如使用sed:

    sed -r 's/^([^#]+)([^=]+)=.*$/\1\2="\1"/' yourfile.txt
    

    在python中也是这样:

    import sys
    import re
    
    for line in sys.stdin.readlines():
        print re.sub('^([^#]+)([^=]+)=.*$', r'\1\2="\1"', line).rstrip()
    

    用途:

    python program.py < yourfile.txt