- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我仍在学习perl6,并且正在阅读此页面上的语法示例:http://examples.perl6.org/categories/parsers/SimpleStrings.html;我已多次阅读有关正则表达式的文档,但仍有一些我不理解的语法。
token string { <quote> {} <quotebody($<quote>)> $<quote> }
token quotebody($quote) { ( <escaped($quote)> | <!before $quote> . )* }
token escaped($quote) { '\\' ( $quote | '\\' ) } # I think this is a function;
最佳答案
TL; DR @briandfoy已提供an easy to digest answer。但是这里有他没有提到的巨龙。还有漂亮的蝴蝶。这个答案很深。
问题1:令牌中的{}
在做什么?
这是一个代码块1,2,3,4。
它是一个空值,仅用于强制$<quote>
中的quotebody($<quote>)
在正则表达式开始时求值为<quote>
捕获的值。$<quote>
在不插入代码块的情况下不包含正确值的原因是Rakudo Perl 6编译器限制或与“匹配变量的发布”有关的错误。
Rakudo对匹配变量进行“公开”
莫里茨·伦茨(Moritz Lenz)在a Rakudo bug report中指出:“除非有必要,否则正则表达式引擎不会发布匹配变量”。
他用“ regex引擎”表示NQP中的regex /语法引擎,它是Rakudo Perl 6编译器的一部分。3
他用“匹配变量”表示存储匹配结果捕获的变量:
当前匹配变量$/
;
编号的子匹配变量$0
,$1
等;
形式为$<foo>
的命名子匹配变量。
通过“发布”,他表示正则表达式/语法引擎会执行所需的操作,以便对正则表达式中的任何变量(令牌也为正则表达式)的任何提及都将评估为它们应该具有的值拥有他们。在给定的正则表达式中,匹配变量应该包含一个Match
object,对应于在处理该正则表达式的任何给定阶段为其捕获的内容,如果没有任何内容,则为Nil
。
“被认为是必需的”他表示正则表达式/语法引擎对匹配过程中的每个步骤之后是否值得进行发布工作进行了保守的呼吁。 “保守”是指引擎通常避免发布,因为它会使事情变慢并且通常是不必要的。不幸的是,有时对于实际何时需要发布过于乐观。因此,程序员有时需要通过显式插入代码块来干预,以强制发布匹配变量(以及其他变量的其他技术5)。正则表达式/语法引擎有可能随着时间的推移在这方面有所改进,从而减少了需要人工干预的情况。如果您希望帮助实现这一点,请创建对您而言与现有相关bug有关的测试用例。5$<quote>
值的“发布”
此处命名的捕获$<quote>
就是这种情况。
据我所知,所有子匹配变量在没有周围构造的情况下直接写入正则表达式时都正确地引用了它们的捕获值。这有效:
my regex quote { <['"]> }
say so '"aa"' ~~ / <quote> aa $<quote> /; # True
$<quote>
获得正确的值,因为它被解析为regex lang语构造。4
{}
从
token string { <quote> {} <quotebody($<quote>)> $<quote> }
$<quote>
中的
quotebody($<quote>)
将不包含开头
<quote>
捕获的值。
$<quote>
在这种情况下被解析为主要的lang语构造。
escaped($quote)
中的
<>
是正则表达式函数,对吗?它以
$quote
作为参数
<foo(...)>
的正则表达式原子是方法
foo
的调用。
token
,
regex
,
rule
,
/.../
或任何其他形式声明的-都是方法。但是用
method
声明的方法不是正则表达式:
say Method ~~ Regex; # False
say WHAT token { . } # (Regex)
say Regex ~~ Method; # True
say / . / ~~ Method; # True
<escaped($quote)>
正则表达式原子时,正则表达式/语法引擎既不知道也不关心
escaped
是否为正则表达式,也不了解
the details of method dispatch inside a regex or grammar。它只是调用方法分派,将调用者设置为由正则表达式构造的
Match
对象。
<escaped($quote)>
的正则表达式原子不会返回另一个正则表达式。
Match
对象的方法。
Match
对象。
Match
对象。莫里茨在他对SO问题
Can I change the Perl 6 slang inside a method?的回答中展示了一个例子。
Match
对象返回到“正则表达式/语法引擎”,该引擎驱动正则表达式匹配/语法解析。3
Match
对象保存为调用正则表达式的子匹配捕获。这就是构建匹配/解析树的方式。
. <!before $quote>
而不是
<!before $quote> .
?
quotebody
正则表达式所需要的,如果这就是您要说的。
<!before $quote>
)。他的观点是,与“不是引号”相匹配比“不是在引号之前?然后匹配任何字符”更容易理解。
<!before $quote> .
,除非/直到修复了这些长期存在的Rakudo错误为止。5
token escaped($quote) { '\\' ( $quote | '\\' ) } # I think this is a function;
Regex
,它是一个
Method
,它是一个
Routine
:
say token { . } ~~ Regex; # True
say Regex ~~ Method; # True
say Method ~~ Routine; # True
{ ... }
位)(在这种情况下,该代码是
.
中的唯一
token { . }
,它是与单个字符匹配的正则表达式原子),写在P6 regex中。 cc语”,而
method
例程主体内部使用的代码则写在主P6“ s语”中。4
~
~
) operator是专门为该问题所涉及的示例中的解析而设计的。它读起来更好,因为它可以立即识别,并且可以将开始和结束的报价保持在一起。更重要的是,它可以在发生故障时提供人为可理解的错误消息,因为它可以说出所要查找的结束定界符。
~
运算符旁边(正反两面)插入一个正则表达式(其中有或没有代码),则必须考虑一个关键问题。除非您特别希望波浪号将代码块视为其自己的原子,否则您将需要对代码块进行分组。例如:
token foo { <quote> ~ $<quote> {} <quotebody($<quote>) }
<quote>
,而它们之间没有任何匹配。 (然后尝试匹配
<quotebody...>
。)
string
语法中复制
String::Simple::Grammar
令牌的匹配行为的方法:
token string { <quote> ~ $<quote> [ {} <quotebody($<quote>) ] }
{...}
就是在正则表达式中间插入任意过程代码所需要的全部。语言设计和regex /语法引擎实现3确保可以识别正则表达式中的传统风格纯声明性区域,因此可以将正式的正则表达式理论和优化应用于它们,但是仍然可以插入任意的正则程序代码。简单用法包括
matching logic和
debugging。但是天空是极限。
{}
)的常见原因是,当为正则表达式中的给定
longest alternation提供所需的匹配语义时,故意终止正则表达式的声明性前缀。 (但这不是将其包含在您想要了解的令牌中的原因。)
String::Simple::Grammar
,代码以英语(
use v6;
语句)开头,然后递归为西班牙语(在
{
的
rule TOP {
之后),即
^ <string> $
位,然后返回译成英文(注释以
# Note ...
开头)。然后,将其递归为
<quote> {} <quotebody($<quote>)> $<quote>
的西班牙语,并在该西班牙语的中间,在
{}
代码块处,再次递归为另一级英语。这就是西班牙文中的英文。当然,代码块是空的,所以就像用英语写/读任何东西,然后立即放回西班牙语一样,但重要的是要了解,这种递归的语言/运行时堆栈是P6的工作方式,两者都是一个单一的总体语言/运行时,以及与其他非P6语言/运行时的配合。
~
构造,而使用“非引号”构造而不是使用
<!before foo> .
。最终结果,再加上相关的错误:
grammar String::Simple::Grammar {
rule TOP {^ <string> $}
token string {
:my $*not-quote;
<quote> ~ $<quote>
[
{ $*not-quote = "<-[$<quote>]>" }
<quotebody($<quote>)>
]
}
token quote { '"' | "'" }
token quotebody($quote) { ( <escaped($quote)> | <$*not-quote> )* }
token escaped($quote) { '\\' ( $quote | '\\' ) }
}
< >
regex调用语法仅在使用它的regex的父范围内查找词法,而不在regex本身的范围内查找。”
rt #127872
EVAL
并且
EVAL
尚不是线程安全的。幸运的是,官方文档提到了这些。
.parse
setting $/
。
关于regex - perl6语法,不确定示例中的某些语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51408141/
我正在尝试编写一个函数,该函数接受输入字符串、正则表达式(由 std.regex.regex 从原始字符串生成)和错误消息字符串,并尝试匹配来自使用正则表达式输入字符串,如果没有匹配则显示错误消息。到
-edit- 注意 ?末.{2,}? 我发现你可以写 .{2,}? 是不是和下面一模一样? .{2} 最佳答案 号{2,}表示两次或更多次同时 {2}意思是正好两次。量词默认是贪婪的,所以给定字符串
我有以下文字: This is a test ::a. MODE 3 within 7 hours, ::b. MODE 4 within 13 hours, and ::c. MODE 5 with
我用 Regex.fromLiteral(".*") 创建了一个非常简单的匹配所有正则表达式. 根据documentation :“返回指定文字字符串的文字正则表达式。” 但是我真的不明白“对于指定的
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
该Web项目将静态内容放入一些/content/img文件夹中。 网址规则是:/img/{some md5} 但在文件夹中的位置:/content/img/{前两位数字}/ 例子 url:
我有以下数据: SOMEDATA .test 01/45/12 2.50 THIS IS DATA 我想从中提取数字 2.50。我已设法使用以下 RegEx 做到这一点: (?<=\d{2}\/\d{
我需要证明或反驳下面的正则表达式 (RS + R )* R = R (SR + R)* // or, for programmers: /(RS|R)*R/ == /R(SR|R)*/ 我有一种强烈的
对于具有自由文本的字符串: "The shares of the stock at the XKI Market fell by €89.99 today, which saw a drop of a
例如,我有 RegEx DSX-?2 的 var 我需要将此变量添加到 RegEx 并获取此 .match(/DSX-?2/gi) 最佳答案 您可以创建一个 RegExp对象使用 new RegExp
我无法区分大小写的搜索无法在SQLITE中用于REGEX。支持语法吗? SELECT * FROM table WHERE name REGEXP 'smith[s]*\i' 我希望得到以下答案(假设
Visual Studio / XPath / RegEx: 给定表达式: (?(Car|Car Blue)) +(?.+) +---> +(?.+) 给定搜索字符串: Car Blue Flying
我有一个看起来像这样的正则表达式 /^(?:\w+\s)*(\w+)$*/ 什么是?: ? 最佳答案 它表示子模式是非捕获子模式。这意味着在 (?:\w+\s) 中匹配的任何内容,即使它被 () 括起
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我在 Excel 工作表(也以 csv 格式)中获得了姓名列表,并根据姓名来源进行了分组。 这就是我创建的组的样子。 现在我想添加一个新列,名称后面包含组名称。 这就是我想要获得的。 我如何得到这个?
我试图将一个字符串拆分为一个字符串列表,单词是分开的,但是周围的字符,例如.. "?()“”!"也分开。 要分隔的字符串是"testing “testing” “one two three” (hi
我有一个来自视频转换文件的完整日志,它看起来像这样: -------------------------------------------------------------------------
在定界符为“-”的模式 X-Y-Z 中,我想检查 Y 是否具有大小 8 而没有重复。 Y 可以是像 Y = (A-B-C) 这样的子集,但如果没有,则 Y 的值为 1 1 - num-12345678
Java确实有这个功能,谢谢你的回答,对我来说失去对API的关注太可惜了... 例如: String strOriginal = "A:B&C@D"; 我认为java中应该有一个非常好的方法来改变它,
我只需要接受符合这些规则的输入... 0.25-24 0.25 的增量(.00、.25、.50、.75) 第一个数字不是必须的。 希望尾随零是可选的。 一些有效条目的示例: 0.25 .50 .5 1
我是一名优秀的程序员,十分优秀!