我正在学习正则表达,现在对我来说似乎非常困惑。
val.replace(/^[^a-zA-Z0-9]*|[^a-zA-Z0-9]*$/g, '');
在上面的表达中
1)哪一部分表示不包括空格?因为我试图排除所有非字母数字字符。
2)因为我不想使用偶数' $'和' '(下划线)我可以指定' $' &安培; ' '(下划线)表达式如下所示?
val.replace(/^[^a-zA-Z0-9$_]*|[^a-zA-Z0-9$_]*/g, '');?
3)' x|y
'指定 - "找到指定的任何替代方案"。那么为什么我们使用了这两面相同的[^a-zA-Z0-9]|[^a-zA-Z0-9]
呢?
请帮助我理解这一点,发现它有点困惑和困难。
答案 0 :(得分:4)
一些基本信息。
当您阅读正则表达式时,您可以从左到右阅读它们。这就是发动机是如何做到的。
这在交替的情况下很重要,因为总是首先尝试左侧的那个。
但是对于$
(EOL或EOS)锚点,从右到左阅读可能更容易。
内置断言,如换行符^$
和单词边界\b
以及正常断言向前看(?=)(?!)
并向后看(?<=)(?<!)
,不要消耗字符。< / p>
它们就像通过或失败的单路径内联条件,只有在它通过时才会检查它右侧的表达式。所以他们确实匹配的东西,他们匹配一个条件。
格式化你的正则表达式,这样你就可以看到它的作用。 (使用应用程序来帮助您RegexFormat 5)
^ # BOS
[^a-zA-Z0-9]* # Optional not any alphanum chars
| # or,
[^a-zA-Z0-9]* # Optional not any alphanum chars
$ # EOS
全局上下文中的正则表达式将始终匹配两次,一次在字符串的开头,一次在结尾处,因为换行锚点,并且因为您实际上并不需要任何其他匹配。
所以基本上你应该避免尝试将所有可选事物与内置锚点^$\b
匹配(混合)。这意味着您的正则表达式更好地由^[^a-zA-Z0-9]+|[^a-zA-Z0-9]+$
表示,因为您不关心其 NOT (在*
的情况下,零或更多量词)。
祝你好运,继续学习。
答案 1 :(得分:3)
此正则表达式替换字符串中的所有起始和尾随非字母数字字符。
它没有具体指定空格。它只是否定了除字母数字字符以外的所有内容。方括号内的任何内容都是字符集 - [Whatever]
。字符集中的起始上限(^
)表示其为否定。因此[^a-zA-Z0-9]*
表示零个或多个字符不是a-z,A-z或0-9。
最后的$
符号表示字符串的结尾,与$和_符号无关。这将包含在字符集中,因为它包含所有非字母数字字符。
请参阅@smathy的回答。
同样只是FYI,滚动教程无法学习AFAIU正则表达式。您只需要了解基础知识并尝试示例。
答案 2 :(得分:1)
为了回答你的第三个问题,替代方案一直运行到//
,所以双方都不一样。在最初的正则表达式中,左边的替代品是#34;字符串的开始的所有非字母数字&#34;正确的选择是&#34;字符串&#34; 结尾的所有非字母数字。