【问题标题】:Error in regexp Go lang正则表达式 Go lang 中的错误
【发布时间】:2018-01-06 05:17:22
【问题描述】:

我正在尝试在 Go 语言中使用这个正则表达式:

~((?<=^[^\s])|(?<=\s[^\s]))\s(?=[^\s](\s|$))~

{(c|d|e|i|l|n|o|p|r|t|z)\1+}

{( |a|b|d|[f-h]|i|[j-k]|m|q|s|[u-y])\1+}

{(c|d|e|i|l|n|o|p|r|t|z)\1+}

{( |a|b|[f-h]|i|[j-k]|m|q|s|[u-y])\1+}

{(si|sa|za|ja|to)\1+}

在每个人中我都会遇到这个错误:

恐慌:正则表达式:编译(~((?&lt;=^[^\s])|(?&lt;=\s[^\s]))\s(?=[^\s](\s|$))~):解析正则表达式时出错:Perl 语法无效或不受支持:(?&lt;

也许有人知道诀窍? :/ 还是无法使用它们?

【问题讨论】:

标签: regex go functional-programming


【解决方案1】:

如果不支持后视,请使用如下解决方法:

((^|\s)\S)(\s)(?=\S(\s|$))

地点:

捕获组 1 包含要写回的内容以代替
向后看。

捕获组 3 是有问题的实际空白。
它位于捕获组中,只是为了将其与整个比赛分开。

总结:第 1 组 + 第 3 组 = 整场比赛。

展开:

 #  (                             # (1 start)
 #       (?<= ^ [^\s] )
 #    |  (?<= \s [^\s] )
 #  )                             # (1 end)

 (                             # (1 start)
      ( ^ | \s )                    # (2)
      \S 
 )                             # (1 end)
 ( \s )                        # (3)
 (?=
      \S 
      ( \s | $ )                    # (4)
 )

【讨论】:

  • 不支持正向前瞻:'(
  • 哦,你是对的。那么唯一的选择是您必须在((^|\s)\S)(\s)(\S(\s|$)) 之前和之后捕获。但是,这会将下一个匹配位置设置在最后一个 \s 之后,如果最后一个匹配的 \s 可用,则可以用于该匹配。如果您将中间的\s 替换为非空格,则每次都可以从头开始匹配。如果可能的话,另一种选择是每次都设置匹配位置。最后的选择是放弃蹩脚的语言,并获得一个不使用 RE2 的真正语言。
  • 最后我选择创建一个函数来加入独立角色:
  • func joinStandAloneChars(str string) string{ arrayStr:= strings.Split(str," ") newStr := "" for _,element := range arrayStr{ if element != " " && element != ""{ if len(element) == 1 { newStr += element; }else{ if len(newStr)>1 && string(newStr[len(newStr)-1:]) == " " { newStr += element +" "; }else{ newStr +=" "+ 元素 +" "; } } } } 返回 newStr }
  • go 的正则表达式让我头疼:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 2016-11-19
相关资源
最近更新 更多