0

我有一个包含由 . 包围的字符串的文本#[ ]。我需要匹配这些字符串并找出里面的字符串。

我的示例文本:

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是因为我想包含点、问号和其他不是字母的字符。这给我带来了一个问题,因为 now #, [and]被包含在内,这导致我的文本只有一个匹配项:

#[This is my first string.] sit amet, consectetur elit,
sed do eiusmod tempor incididunt #[This is my second string?]

当然,它在 的第一次出现#[和最后一次出现时匹配]。如何解决这个问题?我可以接受不包括#,[]在我的字符串中,但如果可能的话,应该包括所有其他非字母字符。

4

2 回答 2

2

你的问题不是\W,而是*。是贪婪的*,将匹配可能的最长字符串。所以它将第一个[与最后一个匹配,]并在两者之间进行所有操作。

试试这个:

\#\[([\w\s\W]*?)\]

实际上,您应该能够将其简化为:

\#\[(.*?)\]

?限定符 ( *or ) 之后将+强制进行最少匹配。即非贪婪。

于 2013-02-11T14:05:31.023 回答
0

你的问题是\W也匹配]

解决此问题的简单方法是:[匹配尽可能多的非]字符后:

(#\[[^\]]*\])

这应该可以很好地解决问题。

于 2013-02-11T14:13:35.390 回答