你能帮忙解决我的这个正则表达式sourceslist.nanorc
吗?
正则表达式:
cdrom:\[[a-zA-Z0-9\._-\(\) ]+\]/
错误:
Bad regex "cdrom:\[[a-zA-Z0-9\._-\(\) ]+\]/": Invalid range end
谢谢。
答案1
问题可能是-
字符列表中标志的位置。
您已经使用过这样一个事实:字符范围可以用 来表示,就像作为的简写一样(尽管请参阅下面的警告)。这意味着 是一个特殊字符,如果它出现在两个“常规”字符之间,则它被解释为指示包含这两个字符以及之间的每个字符的另一个范围。[start-end]
[a-z]
[abcdefghijkl...xyz]
-
当-
(-_
那不能解决你的问题)。
因为您显然想要匹配文字-
,并且取决于正则表达式在中的解释方式.nanorc
,你要么
- 必须逃避它(即
\-
),或者 - 将其放在字符列表的第一个或最后一个(即或),这在 POSIX 和 GNU 正则表达式中是标准的
[-etc]
[etc-]
因此是 Linux 系统上最有可能的解决方案。
参见例如这里供进一步参考。
警告:上面的陈述“[a-z]
是简写[abcdefghijkl...xyz]
为并非无条件真实!如何解释范围取决于区域设置,特别是排序规则顺序。
- 在“C”语言环境中,顺序根据 ASCII 代码值,即
ABC...XYZ...abc...xyz
。这里,[a-z]
实际上表示“全部小写字符”。 - 在大多数其他语言环境中,大写和小写字符组合在一起,即顺序为
aAbBcC...xXyYzZ
。在这里,[a-z]
意思是“除 之外的所有小写字符和所有大写字符Z
。 - 对“元音变音”等非 ASCII 字符的处理是另一个问题。
答案2
将此粘贴于https://regexr.com/有助于更好地调试。
您没有-
在范围内转义,因为-
用于指定范围。
老的:
cdrom:\[[a-zA-Z0-9\._-\(\) ]+\]/
更正:
cdrom:\[[a-zA-Z0-9\._\-\(\) ]+\]/