0

我想编写一个正则表达式来匹配包含在 * 字符中的字符串,就像 markdown 使用它们来** 使事情变得粗体**一样。

但我也希望开头和结尾的 * 数量是可变的。星星的数量将等于该字符串的重要性。

目前我正在使用这个;

/(\*\*\*|\*\*|\*)(.*?)\1/

这适用于最多 *** 三*** 任何一方。这将返回 * 之间的字符串和包含 *** 的字符串。然后我计算该字符串的长度以获得 * 的数量。

在红宝石中,这看起来像;

"*this is important*, but this is ***very important***.scan(/(\*\*\*|\*\*|\*)(.*?)\1/).each do |match|
    points << { :str => match[1], :importance => match[0].length }
end

正则表达式在大多数情况下都可以正常工作,但是如果我想获得 ******** 一些非常重要的东西********;表达会有点失控——按照我目前的方式来做。

我知道我当前的模式是搜索一定数量的 * 并在该字符串与同一字符串的另一次出现之间查找文本。但是考虑人为错误也很好,比如像这样的字符串;

**这很重要*,但***这真的很重要****。

谢谢大家!

4

1 回答 1

2

那么下面的呢?

/(\*+)(.*?)\1/

\*+是一个或多个*

或者,如果您想将其限制为特定数量:

/(\*{1,5})(.*?)\1/

\*{1,5}表示介于 1 和 5 之间*的任何位置。您显然可以随意更改 1 和 5。

两边长度不同:

以上将适用于双方相同数量的*' (因为 back-reference \1)。

如果您想在任一侧允许不同的金额,您可以使用\*+而不是\1,因此:

/(\*+)(.*?)\*+/
于 2013-09-02T14:47:30.180 回答