正则表达式:
import spark.implicits._
import org.apache.spark.sql.functions.max
val df = Seq(("a",30),("b",50),("c",20)).toDF("x", "y")
val x = df.sort($"y".desc).first()
输入:
^(\w+,?\s?)+(?=:): hi hey\?$
输出:挂起
码
Aaaaaaaaa, bbbbbbbb, cccccccc, dddddddddd, eeeeeeeee: hi?
所需行为:找到具有以下模式的字符串
reg = re.compile('^(\w+,?\s?)+(?=:): hi hey\?$')
print reg.search('Aaaaaaaaa, bbbbbbbb, cccccccc, dddddddddd, eeeeeeeee: hi?')
不应匹配的输入示例:
[comma_and_(optionally)space_separated_values][colon][question]
(无值): qqq?
(只有一个值)aa: qqq?
(无问题点)aa, bb: qqq
(格式错误格式)aa, : qqq?
(毫无疑问)aa, bb, cc:?
(格式错误格式)应匹配的输入示例:
, bb, cc: qqq?
aa, bb: qq?
aa, b, c,d,e,f, g, h: qq?
答案 0 :(得分:1)
由于(\w+)+
这种情况,它会挂起
即失败时太复杂
如果匹配则工作正常,失败时爆炸。
此(\w,?\s?)+
与(\w+,?\s?)+
相同,但不会挂起。
因此,将其更改为此^(\w,?\s?)+(?=:): hi hey\?$
并解决问题。
作为奖励,此^(\w,?\s?)+: hi hey\?$
是相同的。
此外,您可以用.*?\?$
代替您的文字hi hey\?$
如果预计是可变的字面值。
Error: Target Operation ..
The complexity of matching the regular
expression exceeded predefined bounds.
Try refactoring the regular expression
to make each choice made by the state
machine unambiguous. This exception is
thrown to prevent "eternal" matches that
take an indefinite period time to
locate.
编辑:
请注意,始终 嵌套量词存在潜在问题。
即那些贪婪和开放的,如(b +
)*
。
通过移除内巢(例如示例中的b+
)几乎可以解决这个问题
通过使其无量化,我们可以称之为伪锚。
也就是说,它应该是第一个在组中,并且是一个未量化的必需字符。
这会强制引导回溯再次转到那个字符进行检查
如果没有量化,它会立即放弃,甚至不会看到
表达的其余部分。
因此,它会越过字符串中的该位置以找到 next 文字b
。
这基本上就是回溯治疗的全部内容。
鉴于回溯陷阱,我们可以制定解决方案以获得所需的匹配。
^\s*(\w+\s*(?:[,\s]\s*\w+\s*)+)\s*:\s*([^:]*?\w[^:]*?)\s*\?\s*$
^ # BOS
\s* # Wsp trim
( # (1 start), Values - minimum of 2 required
\w+ \s* # First word
(?: [,\s] \s* \w+ \s* )+ # One or more space or comma seperated
# word value's
) # (1 end)
\s* # Wsp trim
: # Colon
\s* # Wsp trim
( # (2 start), Question -
[^:]*? # Not a colon
\w # At least a word char
[^:]*? # Not a colon
) # (2 end)
\s* # Wsp trim
\? # '?'
\s* # Wsp trim
$ # EOS