我的文字包含#[ ]
所包围的字符串。我需要匹配这些字符串并找出里面的字符串。
我的示例文字:
Lorem ipsum dolor #[This is my first string.] sit amet, consectetur elit,
sed do eiusmod tempor incididunt #[This is my second string?] ut et dolore magna.
有了这篇文章,我希望有两场比赛:
#[This is my first string.]
#[This is my second string?]
现在我写了正则表达式:
\#\[([\w\s\W]*)\]
我添加了\W
因为我想要包含点,问号和其他不是字母的字符。这会导致我出现问题,因为现在包含#
,[
和]
会导致我的文字只有一个匹配项:
#[This is my first string.] sit amet, consectetur elit,
sed do eiusmod tempor incididunt #[This is my second string?]
当然,它会在#[
的第一次出现和]
的最后一次出现时匹配。
怎么解决这个?我可以接受不在我的字符串中包含#
,[
和]
,但如果可能的话,应包含所有其他非字母字符。
答案 0 :(得分:2)
您的问题不是\W
,而是*
。 *
是贪婪的并且将匹配可能的最长字符串。因此,它会将第一个[
与最后一个]
进行匹配,并将所有内容与之间的内容进行匹配。
试试这个:
\#\[([\w\s\W]*?)\]
事实上,您应该能够将其简化为:
\#\[(.*?)\]
限定符后面的?
(*
或+
)将强制最小匹配。即非贪婪。
答案 1 :(得分:0)
您的问题是\W
也匹配]
解决此问题的简便方法是:在[
匹配尽可能多的非]
个字符之后:
(#\[[^\]]*\])
这应该很好地解决了这个问题。