【问题标题】:POSIX extended Regex - contain not X but Y (std::regex c++11)POSIX 扩展正则表达式 - 不包含 X 而包含 Y (std::regex c++11)
【发布时间】:2016-09-17 18:41:44
【问题描述】:

问题说明

我一直在尝试编写一个正则表达式来传递这种格式:

"bob likes poo - whatever(&T(R)*HP#"
"  \t  \t  bob likes poo - *^RFVOG(IBHUO)B"

但失败了:

 "//bob likes poo - GV*(GF*("
 "# \t  bob likes poo - OHG(G(*"
 "bob does not like poo G&((HOUIHBO:"

它们是关键。

该行不以注释字符(# 或 //)开头,可以有 空格(空格或制表符),后面必须有一些东西 分隔符(“ - ”),后跟任何内容。

极端情况是:

1) " \t   //this is still a comment - YGV^FV*"

应该还是会失败。

2) "   /i_am//_no_/comment - FG&*G*&G"

应该会通过。

随机推理

好吧,我失败了。这让我问我们是否可以指定以某种方式包含某些字符但不能包含其他字符。例如

[^abc]

just 表示任何不是 a、b 或 c 的字符。但是我们怎么说不是 abc 而是 123 呢?我们不能只放

[^abc123]

因为那会排除他们并且不能这样做

[^abc]123

因为这意味着它必须在某个不是 a、b、c 的字符之后有 123 个字符,这总共是 4 个字符而不是我们想要的 1 个字符。我不知道这是否可能。所以从某种意义上说,这里有两个问题。

到目前为止,我最好的选择是:

 "[[:blank:]]*[^[:blank:]]+( - ).*"

这使得格式匹配正确,但不考虑 cmets。

编辑

我找到了可行的解决方案。它有效,但丑得要命:

 "[[:blank:]]*([^[:blank:]#]([^/].*)?|[^[:blank:]#/].*)( - ).*"

如果有人知道如何使它更好,请告诉我。

【问题讨论】:

  • 嗯,"not abc but must be 123" 与 "must be 123" 相同,或者[123] 为正则表达式... 还是我误解了你问题的那一部分?
  • 这是你想要的^[^\/#-]*(?:\/[^\/][^-]*)?-.*吗?
  • 如果将非捕获组(?:...)更改为捕获组(...)会怎样?
  • 如果- 是输入字符串的重要部分,您可以在它们周围添加空格。 egrep 不支持非捕获组。而已。我一开始并不知道。我认为你也不需要逃避斜线。我只是这样做,因为它们可能对 RegEx 引擎有意义。
  • 为什么不应该匹配- eouhfueo

标签: c++ regex c++11 posix-ere


【解决方案1】:

在了解了有关 cmets 中要求的更多信息后,我使用了这个 RegEx:

^[[:blank:]]*(\/([^\/][^-]*|)|([[:blank:]]|^)[^[:blank:]\/#][^-]*) - .*

匹配:

顺便说一句,我不知道为什么真的bob 喜欢 p**

【讨论】:

  • 如果鲍勃喜欢它,那么他就去了。更新了正则表达式。
  • 如果您在grep 中不使用字符串锚点^ 的开头,则匹配可能会出现在字符串中间,这是不希望的。我不确定" 是否用作输入包装器,所以在我提议的正则表达式中我排除了它,而是使用了^。我承认我没有注意您的工作解决方案。我从一开始就有不同的想法,并毫不犹豫地输入更多内容。您自己的解决方案更清洁、更短。如果我见过你的,我永远不会和我一起去。随意不接受这个答案。
猜你喜欢
  • 2022-07-21
  • 2012-02-13
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 2016-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多