正则表达式将匹配的行包装在井号内,但不包括前导空格

时间:2010-03-02 10:01:39

标签: java regex jedit

我是否可以在文本编辑器(Jedit)的“查找/替换”功能中使用正则表达式来执行以下操作:

匹配符合以下条件的文本文件中的所有行:

  1. 该行以右括号结束
  2. 在同一行的某处存在左括号
  3. 如果匹配,我需要在行上包装所有文本 - 但不要在行开头的任何空格 - #符号内。

    示例1

    这一行:

    Total reimbursements (before end of Q1)
    

    需要替换为:

    #Total reimbursements (before end of Q1)#
    

    示例2(引导空白)

    这一行(在Total之前有空格):

                                 Total reimbursements (before end of Q1)
    

    需要替换为此(#符号放在行的第一个字母之前):

                                 #Total reimbursements (before end of Q1)#
    

    但不是这个:

    #                             Total reimbursements (before end of Q1)#
    

    示例文本文件:

    Base Expenses
    &&&&&&&&&&&&&&&&&&&&&&&
    
    
    Provides options towards multilateral improvements
    
    Opening Debt(Option patterns)
              A copy provided externally
    
    Customer Summary
    &&&&&&&&&&&&&&&&&&&&&&&&&
    
     External Console(foreign debt)
              Provide execution amounts
     Internal Console(domestic debt)
              Release to appropriations committee
    
    Explanations provided to external clients
    
     Neutralized Amounts()
              Forex portion
    

4 个答案:

答案 0 :(得分:2)

我这样做了:

regex = /^(\s*)(.*)\((.*)\)$/

并在比赛中打印$ 1#$ 2($ 3)#。

答案 1 :(得分:2)

正则表达式:

^([ \t]*)(.*\(.*\))$

的更换:

$1#$2#

最棘手的事情是确保正则表达式的任何部分都不能匹配换行符。这就是为什么我使用[ \t]*代替\s*.*而不是[^(]*[^)]*

答案 2 :(得分:1)

<强>更新

好的,jEdit默认正则表达式标志中的[^(]+,也吃了\n(我没有看到在jEdit搜索/替换UI中设置多行标记的任何选项),

所以,这是新的,用你的更新文本确认

搜索:^(\s*)([^(\n]+\([^)\n]*\))\s*$
替换:$1#$2

---以前的答案---

Jedit,

搜索:^(\s*)([^(]+\([^)]+\))\s*$
替换:$1#$2

---之前的答案---

Python,'^(\s*)([^(]+\([^)]+\))\s*$'

>>> import re
>>>
>>> re.sub('^(\s*)([^(]+\([^)]+\))\s*$','\\1#\\2','Total reimbursements (before end of Q1)')
'#Total reimbursements (before end of Q1)'
>>>
>>> re.sub('^(\s*)([^(]+\([^)]+\))\s*$','\\1#\\2','                             Total reimbursements (before end of Q1)')
'                             #Total reimbursements (before end of Q1)'
  • 假设行中只有一个括号
  • 如果有尾随空格,
  • \s*最终将不需要
  • 如果你想一次处理多行,你可能也需要re.MULTILINE标志。

答案 3 :(得分:0)

尝试以下方法:

^\s*(?=((.*)(?<=\((.*)\))$))|(?<=\((.*)\))$

只有在前面有一个左括号的情况下,它才能在行的末尾匹配行和一个右括号的行。

用散列替换会给你想要的输出,它也会在行的开头删除空格,如果这是你想要的目标,那么就不会起作用,但最有可能。