Regex 防止正则表达式跳过中间值
我试图使用以下正则表达式在源代码文件中捕获一些字符串值Regex 防止正则表达式跳过中间值,regex,Regex,我试图使用以下正则表达式在源代码文件中捕获一些字符串值 [\s\“\']{1}([A-Za-z0-9\\\-]{1,})[\s\“\']{1} 对于与此类似的变量: var组件='string_1 string_2 string_3' 但是regexp只捕获string_1和string_3跳过string_2 我相信这是因为在捕获string\u 1值时,regexp实际上检测到'string\u 1(注意'和空格)和string\u 3'(还要注意空格和)结果是string_2两边都没有任何
[\s\“\']{1}([A-Za-z0-9\\\-]{1,})[\s\“\']{1}
对于与此类似的变量:
var组件='string_1 string_2 string_3'代码>
但是regexp只捕获string_1
和string_3
跳过string_2
我相信这是因为在捕获string\u 1
值时,regexp实际上检测到'string\u 1
(注意'
和空格
)和string\u 3'
(还要注意空格
和)结果是string_2
两边都没有任何内容,因此它不会被捕获
如何捕获这三个值
请注意,regexp需要捕获以下场景:
"string_1"
'string_1'
"string_1 string2"
'string_1 string2'
"string_1 string2 string3"
等等
它也不需要匹配
$string_1
#string_1$
string_1
//string_1
/*string_1
\string_1
!string_1
等等
仅当值位于单引号、双引号、空格或这三个值中的混合对之间时,我才需要捕获它们。尝试以下操作:/(\b\w+?\b)+?/gm
演示:
说明:
\b
在单词边界处断言位置
\w
匹配任何单词字符(等于[a-zA-Z0-9\
)
+?
在一次和无限次之间进行匹配,匹配次数尽可能少,根据需要进行扩展(惰性)
更新:
我更新了原来的问题,增加了一些细节和澄清。不幸的是,这也与$string_1匹配
好的,那么您可以尝试一下:^(?:“|”)(.*)(?:“|”)$
演示:
如何捕获这三个值
使用([^\W]+)
,1到多个匹配项将具有每个非间隔项
基本上是说,在可用字符集\w
中使用^
(not)\w
(任何非字符)在1到多个+
的集合中匹配任何非的字符。如果您的正则表达式引擎是PCRE(PHP),则可以使用以下正则表达式:
(?:\"|\G) *\K\w+(?=.*\")|(?:\'|\G) *\K\w+(?=.*\')
以下操作由正则表达式引擎执行:
(?: # begin a non-capture group
\" # match double-quote
| # or
\G # continue from where last match ended
) # end non-capture group
\ * # match 0+ spaces
\K # forget everything matched so far
\w+ # match 1+ word chars
(?= # begin positive lookahead
.* # match 0+ chars in same line
\" # match double quote
) # end positive lookahead
| # or
(?:\'|\G) # as above except single rather than double quote
\ *\K\w+ # as above
(?=.*\') # as above except single rather than double quote
基于PCRE的RegEx-flavors有一个稍有不同的表达式,它依赖于捕获分隔符,预先检查在允许的字符数可变之后是否可以再次找到相同的分隔符,并且只匹配允许的单词,只要它们跟随开头分隔符
/(['”])(?=[\w]+\1)\K\w+\G\K\w+/G
\K
用于从返回的匹配字符串中删除其前面的字符
请参阅。当前模式无效,括号不匹配。仅供参考。{1}
除了产生噪音外,完全不做任何事情。下划线不需要转义,在字符类中的第一个或最后一个时(-
)。请更正语法错误:您的字符类格式不正确-如果确实是出于您的意图,您使用的是一个封闭的圆括号而不是封闭的方括号。感谢您的快速回答。我已更新原始问题,以添加更多详细信息和说明。不幸的是,这也与$string_1匹配…感谢您的快速回答回答。我已经更新了原始问题,添加了更多的细节和澄清。不幸的是,这也匹配$string_1…@monroo没问题。谢谢你的反馈。我更新了我的答案。这太棒了。但是它匹配了分布在多行中的字符串。请参见。它可以修改为不接受新行或任何其他字符吗单引号、双引号和规则空格?我没有得到您在第二句中提到的结果,但我将允许的字符改为单词字符(\w
)。可以吗?这很完美。谢谢。