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
)。可以吗?这很完美。谢谢。