正则表达式将捕获从'标记到行尾的所有内容?


122

我有一个文本文件,用单个表示备注'

有些行有两个引号,但我需要从a的第一个实例'和换行中获取所有内容。

I AL01                  ' A-LINE                            '091398 GDK 33394178    
         402922 0831850 '                                   '091398 GDK 33394179    
I AL02                  ' A-LINE                            '091398 GDK 33394180    
         400722 0833118 '                                   '091398 GDK 33394181    
I A10A                  ' A-LINE 102                       '  53198 DJ  33394182    
         395335 0832203 '                                  '  53198 DJ  33394183    
I A10B                  ' A-LINE 102                       '  53198 DJ  3339418

Answers:



90

适当的正则表达式为'char,后跟任意数量的任何char [包括零个char],以字符串/行标记的结尾结尾:

'.*$

如果要捕获'char 之后的所有内容但不将其包含在输出中,则可以使用:

(?<=').*$

这基本上是说给我所有跟随'char直到行尾的字符。

编辑:已经注意到,使用。*时$是隐式的,因此并非严格要求,因此模式如下:

'.* 

从技术上讲是正确的,但是更明确一些是明确的,避免在以后的代码维护中造成混淆,因此我使用$。我认为,在可能会质疑清晰度的情况下,声明显式行为总比依赖隐式行为好。


1
$是不必要的。在正常情况下,该点将停在行尾。
Tomalak

7
不必要-但是适合他想做的事。稍后提醒您,它期待从'到行尾的所有内容
gnarf

@balabaster:我没有说错。;-)这只是一个脚注。
Tomalak

@Tomalak:并不试图暗示您有任何错误,只是在阐明我选择使用$而不是不使用$的理由。感谢您指出。
09年

+1:包括如何在所涉及的角色之后包括所有内容,而不是总是包括所有内容。
grizzasd

22
'.*$

以单引号(')开头,将任何字符(.)匹配零次或多次(*),直到该行的结尾($)。


这个答案是一个很好的例子,说明了如何分解清楚而清晰的命令背后的逻辑!
Timmah

12

当我在Windows(记事本++)中尝试'。*时,它将匹配first'之后的所有内容,直到最后一行的末尾。

为了捕获所有内容,直到该行的结尾,我键入了以下内容:

'.*?\n

这只会捕获从'到该行末尾的所有内容。


6

在您的示例中,我将采用以下模式:

'([^\n]+)$

使用多行和全局选项来匹配所有事件。

要将换行符包含在匹配中,您可以使用:

'[^\n]+\n

但是,如果没有换行符,则可能会错过最后一行。

对于单行,如果不需要匹配换行符,我更愿意使用:

'[^$]+$

4

这将捕获到反向引用1中直到'的所有内容,以及反向引用2中'之后的所有内容。您可能需要转义撇号,具体取决于语言(\')

/^([^']*)'?(.*)$/

快速修改:如果该行没有'-反向引用1仍应捕获整行。

^ - start of string
([^']*) - capture any number of not ' characters
'? - match the ' 0 or 1 time
(.*) - capture any number of characters
$ - end of string

0

https://regex101.com/r/Jjc2xR/1

/(\w*\(Hex\): w*)(.*?)(?= |$)/gm

我敢肯定,这是可行的,它将在结构不良的文本多行波纹管中捕获de hexa系列

     Space Reservation: disabled
         Serial Number: wCVt1]IlvQWv
   Serial Number (Hex): 77435674315d496c76515776
               Comment: new comment

我是regex的永恒新手,但我会尽力向您解释

(\ w *(Hex):w *):在字符串包含“ Hex:”的行中查找文本

(。*?)这是第二个捕获的文本,表示之后的所有内容

(?= | $)创建一个限制,即=和|之间的空格。

因此,对于第二组,您将拥有价值


这不是问题,不是吗?
Daniel E.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.