用于同时捕获一串字符的正则表达式
RegEx for capturing a string of characters at the same time
我需要创建一个基于正则表达式(Regular Expression)的过滤器。这是示例:
必须创建一个可以过滤这两个数据文件名的过滤器:
ZVSEBACTAA.PACS_.0230.[YYYYMMDDhhmmss].[Q5].EBA.S202SCTAAAAAAAA.I
ZVSEBADD11.PACS_.0230.[YYYYMMDDhhmmss].[Q5].EBA.S202COR11111111.I
为了包括他们两个的所有句子,我们有这个正则表达式(已经完成):
(^(ZVSEBACT|ZVSEBADD)[A-Z,0-9]{2}\.PACS_\.0230\.)(.*)\.EBA\.(S202(SCT|COR))([A-Z,0-9]{8})\.I$
但是,我需要找到一个过滤器来过滤 AAAAAAAA(总共 8 个长度的字符串),但也可以用 11111111(同样的长度,但在这种情况下用数字)代替,在所有情况下,总共 8 个字符可以是数字或可互换的字符。
我创建的过滤器(使用 Notepad++ 作为编码工具):
([A-Z,0-9]{8})\.I$
这意味着我想过滤一串长度为8的字符,但我的疑问是最后,我不知道如何只selected到最新的A(或1 ), 以覆盖第一行的 AAAAAAAAA,以及第二行的 11111111。
创建过滤器后,应该 selected AAAAAAAAA 和 11111111,但实际上是 select AAAAAAAAAA.I 和 11111111.I。
ZVSEBACTAA.PACS_.0230.[YYYYMMDDhhmmss].[Q5].EBA.S202SCTAAAAAAAA.I
ZVSEBADD11.PACS_.0230.[YYYYMMDDhhmmss].[Q5].EBA.S202COR11111111.I
没有错误或警告,但应跳过结尾 (.I),预计仅涵盖上述 8 个位置。
根据您使用的正则表达式的类型(有几种不同的类型),您应该能够使用积极的前瞻而不是在最后捕获文本。
例如:
(\b(ZVSEBACT|ZVSEBADD)[A-Z,0-9]{2}\.PACS_\.0230\.)(.*?)\.EBA\.(S202(SCT|COR))([A-Z,0-9]{8})(?=\.I\b)
我更改了一些内容:
正则表达式中的字符 .
是一个通配符,因此我将它们设为 \.
在看起来您实际上是在寻找 .
字符的地方。
上面的文本我 copy/pasted 粘贴在一行中,所以我将 ^ 和 $ 更改为 \b (单词边界),这允许同一行上的多个匹配项匹配两个数字。
添加(?=\.I\b)
向前看(捕获后)以确保接下来的字符是.I
后跟单词的结尾(即文档结尾或space, 等) 而没有捕获它们。
在 regex101 上试用一下,如果这不是您想要的,请告诉我!
您说过您正在使用 Notepad++,这里有一个方法:
- Ctrl+F
- 查找内容:
^ZVSEB(?:ACT|ADD)[A-Z0-9]{2}\.PACS_\.0230\..+?\.EBA\.S202(?:SCT|COR)\K[A-Z0-9]{8}(?=\.I$)
- 选中环绕
- 检查正则表达式
- 取消勾选
. matches newline
- 在当前文档中查找所有内容
解释:
^ # beginning of line
ZVSEB # literally
(?:ACT|ADD) # non capture group, ACT or ADD
[A-Z0-9]{2} # 2 uppercase or digit
\.PACS_\.0230\. # literally
.+? # 1 or more any character, not greedy
\.EBA\.S202 # literally
(?:SCT|COR) # non capture group, SCT or COR
\K # forget all we have seen until this position
[A-Z0-9]{8} # 8 uppercase or digit
(?=\.I$) # positive lookahead, make sure we have after: .I then end of line
屏幕截图:
我需要创建一个基于正则表达式(Regular Expression)的过滤器。这是示例:
必须创建一个可以过滤这两个数据文件名的过滤器:
ZVSEBACTAA.PACS_.0230.[YYYYMMDDhhmmss].[Q5].EBA.S202SCTAAAAAAAA.I
ZVSEBADD11.PACS_.0230.[YYYYMMDDhhmmss].[Q5].EBA.S202COR11111111.I
为了包括他们两个的所有句子,我们有这个正则表达式(已经完成):
(^(ZVSEBACT|ZVSEBADD)[A-Z,0-9]{2}\.PACS_\.0230\.)(.*)\.EBA\.(S202(SCT|COR))([A-Z,0-9]{8})\.I$
但是,我需要找到一个过滤器来过滤 AAAAAAAA(总共 8 个长度的字符串),但也可以用 11111111(同样的长度,但在这种情况下用数字)代替,在所有情况下,总共 8 个字符可以是数字或可互换的字符。
我创建的过滤器(使用 Notepad++ 作为编码工具):
([A-Z,0-9]{8})\.I$
这意味着我想过滤一串长度为8的字符,但我的疑问是最后,我不知道如何只selected到最新的A(或1 ), 以覆盖第一行的 AAAAAAAAA,以及第二行的 11111111。
创建过滤器后,应该 selected AAAAAAAAA 和 11111111,但实际上是 select AAAAAAAAAA.I 和 11111111.I。
ZVSEBACTAA.PACS_.0230.[YYYYMMDDhhmmss].[Q5].EBA.S202SCTAAAAAAAA.I
ZVSEBADD11.PACS_.0230.[YYYYMMDDhhmmss].[Q5].EBA.S202COR11111111.I
没有错误或警告,但应跳过结尾 (.I),预计仅涵盖上述 8 个位置。
根据您使用的正则表达式的类型(有几种不同的类型),您应该能够使用积极的前瞻而不是在最后捕获文本。
例如:
(\b(ZVSEBACT|ZVSEBADD)[A-Z,0-9]{2}\.PACS_\.0230\.)(.*?)\.EBA\.(S202(SCT|COR))([A-Z,0-9]{8})(?=\.I\b)
我更改了一些内容:
正则表达式中的字符 .
是一个通配符,因此我将它们设为 \.
在看起来您实际上是在寻找 .
字符的地方。
上面的文本我 copy/pasted 粘贴在一行中,所以我将 ^ 和 $ 更改为 \b (单词边界),这允许同一行上的多个匹配项匹配两个数字。
添加(?=\.I\b)
向前看(捕获后)以确保接下来的字符是.I
后跟单词的结尾(即文档结尾或space, 等) 而没有捕获它们。
在 regex101 上试用一下,如果这不是您想要的,请告诉我!
您说过您正在使用 Notepad++,这里有一个方法:
- Ctrl+F
- 查找内容:
^ZVSEB(?:ACT|ADD)[A-Z0-9]{2}\.PACS_\.0230\..+?\.EBA\.S202(?:SCT|COR)\K[A-Z0-9]{8}(?=\.I$)
- 选中环绕
- 检查正则表达式
- 取消勾选
. matches newline
- 在当前文档中查找所有内容
解释:
^ # beginning of line
ZVSEB # literally
(?:ACT|ADD) # non capture group, ACT or ADD
[A-Z0-9]{2} # 2 uppercase or digit
\.PACS_\.0230\. # literally
.+? # 1 or more any character, not greedy
\.EBA\.S202 # literally
(?:SCT|COR) # non capture group, SCT or COR
\K # forget all we have seen until this position
[A-Z0-9]{8} # 8 uppercase or digit
(?=\.I$) # positive lookahead, make sure we have after: .I then end of line
屏幕截图: