正则表达式查询帮助 - 向后查找

3
这与正则表达式-在块中格式化文本有些相关,但问题不同。
寻找带有以下条件的-的包装文本:
条件:
  • 标记可以位于行的开头或结尾。
  • 标记必须被空格或一个或多个符号包围:{.,!@#$....}。

    • 题的-对所包含的正常字符[a-zA-Z]不能包围。
    • 查看示例测试3...w-thank you-
    • 测试4和5成功是因为-被[^a-zA-Z]包裹
  • 第一个-后面不能跟一个空格,最后一个-前面也不能跟一个空格
    • "-Wow -"将不匹配,因为关闭-之前有一个空格。
    • 查看示例测试6和7
对于正则表达式的前部分,我需要:(^|[\s\W]+)
结尾将会是:($|[\s\W]+) 我有当前的表达式,但由于转义条件在找到第一个-后停止,所以它失败了。
   (^|[\s\W]+)-([^\s][^-]*)-($|[\s\W]+)

样例测试字符串如下:

  1. (全部): -哇-谢谢你-
  2. (哇): -哇-谢谢你!
  3. (NIL): - 哇-谢谢你-
  4. (谢谢你): - 哇!-谢谢你-
  5. (谢谢你): - 哇-谢谢你-
  6. (全部): -哇 - 谢谢你-
  7. (NIL): -哇 - 谢谢你 -

这需要使用后顾吗?(我是正则表达式新手,请多包涵)还是我的中间条件完全错误。

非常感谢!
mwolfe。


我不理解你在第二个条件之后的第一个评论。 - Rohit Jain
1
示例3由于在“-谢谢你-”之前有一个字符“w”,因此未能满足条件。如果该字符是空格或符号,则“-谢谢你-”将被识别/标记/找到。这就是为什么示例4有效,因为“-”之前的字符是“!”。 - Mike Wolfe
1
+1 - 非常好的尝试,特别是对于一个(自称)新手来说。 - Andrew Cheong
1
一些无关的指针,虽然你可能已经知道了。 (1) 注意\w类包括下划线和数字!最好使用[a-zA-Z][a-zA-Z0-9]。 (2) 通过使用/.../i修饰符可以调用不区分大小写的匹配,因此只需要编写[a-z][a-z0-9]即可。 (3) 注意字符的宇宙不仅限于字母、数字和符号。你说标记必须被空格或一个或多个符号包围。但是你又说,好像等价的是,它不能被[a-zA-Z]包围。这些不一定相同。 - Andrew Cheong
1个回答

1

尝试简化中间表达式。

(^|[\s\W]+)-(.*?)-($|[\s\W]+)
             ^^^

非贪婪通配符匹配将捕获最小字符串以匹配以下内容-($|[\s\W]+)

编辑。 好的,我明白为什么那是错误的了。您希望在开头和结尾破折号后面立即跟随非空格字符。因此,请尝试这个:

(^|[\s\W]+)-(\S.*?\S)-($|[\s\W]+)
             ^^   ^^

1
更好了。但它没有捕捉到测试#6。 - Mike Wolfe
1
你确定吗?这个对我来说是有效的:http://rubular.com/r/xhXidunhmF。除非我误解了你的例子。 - Andrew Cheong
1
谢谢!!!你在rubular上的链接比你第一篇帖子更先进。感谢rubular;一直在使用regex101.com进行测试。 - Mike Wolfe
哦,你可能没有看到我所做的修改,请尝试刷新页面。对于最初的回答感到抱歉。不用谢! - Andrew Cheong
1
但是,是的,你提出的方法也可以。不过你可能想把 [^\s] 放在捕获组里面。 - Andrew Cheong
1
我非常感激。非常感谢您,acheong87。 - Mike Wolfe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接