regex 如何在一行文本的中间找到用#或磅号或哈希标签 Package 的文本?

hgtggwj0  于 2023-06-07  发布在  其他
关注(0)|答案(1)|浏览(104)

期望行为

| 输入|输出|
| - -----|- -----|
| Loren, here is some #IN#-line #TEXT# ipsum.| (IN)(TEXT)|

尝试失败

(?:?<!^)(?:^\s*)(#\s*[^\n\r]+\s*#+)(?:?<!$)

  • (?:?<!^) ...除行首以外的任何内容的非捕获组
  • ( ...开始组
  • ?: ...表示该小组不应捕获任何内容
  • ?<! ...消极的向后看
  • ^ ...字符串的开头或类似换行符的字符串\n\r?|\r?\n
  • ) ...组结束。
  • (?:^\s*)不捕获行的开头或零个或多个白色字符
  • (#\s*[^\n\r]+\s*#+)
  • (开始捕获组
  • #恰好一个磅符号、数字符号或哈希标签
  • \s*
  • \s white-space,like tabs,and carriage returns,et cetra...
  • *零或更多。(0,+∞)
  • [^\n\r]+ ...除换行符或回车符以外的任何内容
  • \s* ...零个或多个空格,其中空格为\s
  • #+ ... #中的一个或多个
  • ) ...组结束。
  • (?:?<!$)非捕获组,用于除行首以外的任何内容
  • ( ...开始组
  • ?: ...表示该组应是非捕获组。
  • ?<! ...消极的向后看
  • $ ...字符串结尾或类似换行符的字符串\n\r?|\r?\n
  • ) ...组结束
kokeuurv

kokeuurv1#

您可以首先匹配您想要“不碍事”的内容,然后对您想要保留的内容使用带有捕获组的交替:

^[^\S\r\n]*#|#([^\r\n#]+)#(?![^\S\r\n]*$)

图案吻合

  • ^字符串的开头
  • [^\S\r\n]*#匹配不带换行符的可选空格字符,后跟#
  • |
  • #按字面匹配
  • ([^\r\n#]+)捕获组1,匹配1+除换行符或#以外的字符
  • #按字面匹配
  • (?![^\S\r\n]*$)负先行,在字符串末尾的右侧Assert非空白字符

Regex demo
请注意,如果匹配从#到下一个#,则只匹配此字符串#TEXT1#TEXT2#中的TEXT1
如果支持lookbehindAssert中的无限量词:

(?<!^[^\S\r\n]*)#([^\r\n#]+)#(?![\r\n]*$)

Regex demo

相关问题