RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1125767
Accepted
Elvin
Elvin
Asked:2020-05-15 03:50:02 +0000 UTC2020-05-15 03:50:02 +0000 UTC 2020-05-15 03:50:02 +0000 UTC

这样的正则表达式是如何工作的?

  • 772

我不知道这个正则表达式在 Lex 中是如何工作的:

1)     \"([^\\\"]|\\\n|\\.)*\"

第一个表达式捕获这样的条目 :"one"或"test". 也就是说,双引号中的单词。以下是我对第一个正则表达式的了解:

\" - экранирование спец. символа кавычка
(что-то в скобках)* - звёздочка означает любое (в том числе и 0) число вхождений символа

然后括号里面是|,表示или,即[^\\\"]要么 要么\\\n被选中\\.

我试图弄清楚[^\\\"]这些是什么\\\n意思\\.。

我将从 [^\\\"]. 方括号中的抑扬符(^)表示如果字符不相等则选择任何字符串\ или "(我看到斜线转义和引号转义)。

然后 or 符号后跟\\\n。在这里,我再次看到斜线字符的转义和到新行的过渡。

然后 -\\.转义点(根据定义,点接受除 \n 之外的任何字符)。也就是模板要找字符\.

问题:以上所有内容如何帮助捕捉像"one"or之类的词"test"?我是否正确识别每个条目的含义?尚不清楚为什么有\\\n必要\\.

регулярные-выражения
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    Qwertiy
    2020-05-15T07:05:36Z2020-05-15T07:05:36Z

    这是一个匹配双引号中的字符串的正则表达式,根据许多编程语言的规则编写,例如,C和C++、Javascript、JSON、C#、Java(虽然其中一些没有换行的能力)。

    var regex = /\"([^\\\"]|\\\n|\\.)*\"/g
    
    function f() {
    var someString = "строка \
    продолжается \x20 \u0020 \u{20}\
    кавычка \" и обратный слеш \\ и перед переносом \\\
    а может настоящий перенос?\n\
    или экранирование\ невпопад\
    ну и пора закруглятьося,\
    но сначала - обратный слеш\\"
    
    var s = "пора искать"
    }
    
    (""+f).match(regex).map(s => console.log(s))

    它是如何工作的?

    引号中可以包含什么?一个常规字符或用反斜杠转义的东西。但是斜线本身也可以被另一个斜线转义。我们不能只是处理\\,因为情况对我们来说\\\"也\\\\"完全不同——第二个结束,而第一个没有。所以在处理转义斜线时,我们需要确切知道它转义的是什么。所以在第一个分支中,我们采用普通字符——除了引号(它结束行)和反斜杠之外的所有字符——它肯定会转义一些东西。现在,对于其余的分支,我们知道它们以斜杠开头(引号结束字符串 - 无需对其进行任何操作)。所以我们要处理不同版本的转义。首先, \0, \7, \07, \x20, \u0020, \u{1f60b}, \\,\n,\t和其他的,还有一些语言允许在任何字符之前转义。其次,直接换行。从理论上讲,我们应该列出所有这些选项,但如果我们更仔细地观察它们,就会发现只有对我们来说是危险的\\,其余的可以沿着主分支 - 那里没有第二个斜线。因此,我们稍微简化了表达式,并说\任何字符都可以跟在后面(正好被斜线转义),如果斜线转义更长的序列,那么主分支会处理它——这对我们来说是安全的。为什么至少需要吃一个角色?这样在回滚时,搜索算法就不能分成\\两次出现\. 好吧,为什么要单独换行-您自己说-它在点上不匹配。确实,取决于语言、操作系统和获取行的方法,从 中出现换行符\r\n,而不仅仅是一个可能会在其中弹出\n- 我不确定这种情况是否由正则表达式处理 - 它可能是值得添加一个选项,该选项可能还取决于第一个分支与换行符的匹配,但您可以编写更通用的\\\r?\n. 好吧,如果我们解析 php.ini 之类的内容,您可能希望在第一个分支中添加一个干净的换行符。

    PS:而且常规赛中的报价本身,理论上是不需要转义的。这显然不是来自字符串的正则表达式,因为字符串中需要更多的转义(你好 Java)。虽然我不明白它写在哪里,但也许那里确实有必要。

    • 3
  2. Alex R.
    2020-05-15T05:11:59Z2020-05-15T05:11:59Z

    此表达式查找三种类型的带引号的字符串:

    第一种选择:任何不包含\.

    "one"
    

    第二种选择:在第一行以新行的形式添加内部有中断的行,之前有\

    "\
    "
    и
    "one\
    two"
    

    第三种选择:在第一行添加带有任何字符的斜线的行。

    "\o" и "one\"two" и "one\\two"
    

    在我看来,之前有额外的转义"(或者这是 lex 的一个特性)。至少https://regex101.com/不接受它们,符号本身"也没有特殊含义。在第三种选择中,不是一个点被转义,而是一个斜线。

    如果您不考虑 2 和 3 的简单情况,当它们返回自己时,如果前面有斜杠,则 2 添加一个中断,3 用斜杠转义任何一个字符,所有这些都在找到 1 的字符串中.

    对于 3,我也会做一个集合,例如,["\\]

    是的,对于搜索“一个”,“测试”就足够了\"([^\\\"])*\"。

    • 0

相关问题

  • PHP 帮助编写正则表达式来解析 URL

  • 密码的正则表达式

  • 从正则表达式中排除特定数字

  • 在生成的表格列中将引号转换为人字形

  • 在 .htaccess 中使用正则表达式提示

  • RegExp - 找到一组相同类型的字符串,它们之间可以有任意字符串

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5