【发布时间】: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?