- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在使用 TRegEx.replace
时遇到问题:
var
Value, Pattern, Replace: string;
begin
Value := 'my_replace_string(4)=my_replace_string(5)';
Pattern := 'my_replace_string\((\d+)\)';
Replace := 'new_value(\1)';
Value := TRegEx.Replace(Value, Pattern, Replace);
ShowMessage(Value);
end;
预期结果为 new_value(4)=new_value(5)
,而我的代码(用 Delphi XE4 编译)给出 new_value(4)=new_value()1)
使用 Notepad++,我得到了预期的结果。
使用命名组可以明确 1
反向引用按字面意思处理:
Pattern := 'my_replace_string\((?<name>\d+)\)';
Replace := 'new_value(${name})';
// Result: 'new_value(4)=new_value(){name})'
替换总是那么简单(可能是零次或多次 my_replace_string
),因此我可以轻松创建自定义搜索和替换函数,但我想知道这里发生了什么。
这是我的错还是bug?
最佳答案
我可以在 Delphi XE4 中重现该错误。我在 Delphi XE5 中得到了正确的行为。
该错误存在于 TPerlRegEx.ComputeReplacement
中。我向 Embarcadero 贡献的用于包含在 Delphi XE3 中的代码使用了 UTF8String
。在 Delphi XE4 Embarcadero 中,从 RegularExpressionsCore
单元中删除了 UTF8String
,并用 TBytes
代替。进行此更改的开发人员似乎忽略了 Delphi 中字符串和动态数组之间的一个关键区别。字符串使用写时复制机制,而动态数组则不然。
因此,在我的原始代码中,TPerlRegEx.ComputeReplacement
可以执行 S := FReplacement
,然后修改临时变量 S
以替换反向引用,而无需影响 FReplacement
字段,因为两者都是字符串。在修改后的代码中,S := FReplacement
使 S
指向与 FReplacement
相同的数组,并且在 S
中进行反向引用时> 被替换,FReplacement
也被修改。因此,第一个替换是正确的,而接下来的替换是错误的,因为 FReplacement
被破坏了。
在 Delphi XE5 中,通过用此替换 S := FReplacement
来制作正确的临时副本来修复此问题:
SetLength(S, Length(FReplacement));
Move(FReplacement[0], S[0], Length(FReplacement));
当 Delphi 2009 发布时,Embarcadero 进行了很多讨论,认为不应使用字符串类型来表示字节序列。看来他们现在犯了相反的错误,使用 TByte 来表示字符串。
我之前向 Embarcadero 推荐过的解决方案是切换到新的 pcre16 函数,该函数像 Delphi 字符串一样使用 UTF16LE。这些函数在Delphi XE发布时并不存在,但现在有了,应该使用它们。
关于regex - Delphi TRegEx 反向引用损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20970339/
我见过几个 TRegEx 使用的 Delphi 示例,例如 Delphi 10.1.2 中的以下示例: try RegexObj := TRegEx.Create(REGEX_EXTRACTEMA
我正在处理 TStringList 中的多个字符串,并且想要跳过一些与特定正则表达式模式不匹配的行。因此我创建了一个 ^(?!\t\w+\t\w+) 的模式并尝试过 program P; uses
如果它们与模式匹配,我想将大字符串中的所有字符@替换为#13#10。 但是如何获取我的“[0-9][0-9][0-9][0-9][0-9][0-9][0-9]”的值要放入我的替换字段的模式? patt
我在使用 TRegEx.replace 时遇到问题: var Value, Pattern, Replace: string; begin Value := 'my_replace_str
我创建了一个使用 Tregex 提取子树的类。我使用了“TregexPattern.java”中的一些代码片段,因为我不想让程序使用控制台命令。 一般来说,有一个句子的树,我想提取某些子树(没有用户交
我有一个小函数,用于在用户取消编辑后验证 StringGrid 中的列。 void validateColumn(int column, const UnicodeString regexp, TSt
背景:我遇到的一个应用程序使用 TRegEx来自多个线程的单例。单例初始化为 TRegEx.Create(Pattern, [roCompiled])在类构造函数中,线程使用它以 RegEx.Matc
我试图弄清楚是否可以使用多个单词的条件有效地提取 NP。这是我当前的代码: public static List getNounPhrasesWithMultipleKeywords(Annotati
我希望在 Delphi XE 中创建一个正则表达式,它将匹配一个数字,后跟一个小数点,后跟(本质上)无限数量的数字。 有效示例: 2.334 150.2 0.23 3 无效示例: 3..42 4-2.
我编写了一个正则表达式,其作用是将所有匹配项返回到其三个备用捕获组。我的目标是了解每场比赛是哪个捕获组产生的。 PCRE 似乎能够产生该信息。但我还无法强制 Delphi XE8 中的 TRegEx
我想根据连词和逗号分割树。例如,当我有 VP 和 VP 或 NP 和 NP 或 VP, VP 或 NP,NP 时,我想分别提取每个 VP 或 NP。我有以下代码: List subtrees = c
我是 NLP 和 Python 的新手。我正在尝试使用 Tregex 工具和 Python 子进程库从 StanfordCoreNLP 的解析树中提取名词短语的子集。特别是,我正在尝试查找并提取与以下
我是一名优秀的程序员,十分优秀!