2016-12-12 48 views
1

分隔多年多段,我曾经在记事本中一个非常方便的技巧++和赛特这让我由一个令牌拆分给定的字符串了。例如,给定此输入:记事本++的正则表达式:匹配的令牌

first name|last name 
bob|johansen 
scarlet|scarnetti 
nelson|huguemeyer 

然后,我可以执行一个正则表达式来将其转换为HTML表格。搜索字符串将是:

(.+)|(.+) 

而替换字符串是:

<tr><td>\1</td><td>\2</td></tr> 

最终的结果将是:

<tr><td>first name</td><td>last name</td></tr> 
<tr><td>bob</td><td>johansen</td></tr> 
<tr><td>scarlet</td><td>scarnetti</td></tr> 
<tr><td>nelson</td><td>huguemeyer</td></tr> 

当我有数以百计的长行的电子表格并需要转换成HTML格式,这是非常有用的!

不幸的是,在最近的版本似乎正则表达式引擎已经改变,使得上面不再作品我的搜索模式。的(.+)第一次出现从线到线的末端的开始处匹配的一切,忽略了中间的|字符。

我已经无可奈何地通过各种不同的搜索模式试图找到一个将获得一切到第一个|,然后一切后面的一切。在较长的实例中,有可能是通过|字符分隔五或六个不同的段。

到目前为止,我的努力都失败了。在Notepad ++中,通过正则表达式在特定的标记中分割一行输入需要做些什么?

+2

曾经出现过的工作?我认为你需要'(。+)\ |(。+)'。如果你需要所有的* first *'|',那么你的模式根本就不工作,你需要'(。*?)\ |(。*)'。 *在较长的例子中,可能会有五个或六个不同的段被|隔开人物。* - 那你想要什么? –

+0

它发生,我要替换所有'|'和'​​'(无需正则表达式),然后2)'^'正则表达式用'​​'3)'$'和''。这可以被打包成1个正则表达式替换。 –

+0

是的,它工作很好多年。但是我最近升级到了更新的版本 - 从2007年起我一直在使用SciTE版本,直到最近,它看起来像最近的Notepad ++有很多不同之处。例如,'|'在我的旧版本中不是常规表达式的重要字符。当我习惯单线时,它似乎默认在多行上运行。根据你的第二条评论,我尝试了'^([^ \ |] +)\ |([^ \ |] +)\ |([^ \ |] +)$'我想要的。作为答案的文件,我会接受它。 –

回答

2

在当前的NPP版本中,|替换运算符。它必须在字符类之外转义以匹配文字管道符号。

^([^\|]+)\|([^\|]+)\|([^\|]+)$将只匹配3部分|分隔字符串。

我想建议实现该逻辑在我second comment到问题的正则表达式:

(^)|($)|\| 

(?{1}<tr><td>:?{2}</td></tr>:</td><td>) 

搜索模式替换113

  • (^) - 组1:行的开始
  • | - 或
  • ($) - 组2:线
  • |的端 - 或
  • \| - 字面|

更换细节

  • (?{1} - 如果第1组匹配,
    • <tr><td> - 取代(实际上,加)<tr><td>在该行开始
  • :?{2} - 否则,如果第2组匹配,
    • </td></tr> - 在行添加</td></tr>结束
  • : - 否则,|被替换</td><td>
  • ) - 条件置换条款结束。

见截图:

enter image description here

+0

谢谢。将来我想我会用一些不太可能成为保留字的东西作为我的标记,比如说aÞ或类似的东西。 –