【问题标题】:Regex - Escape character正则表达式 - 转义字符
【发布时间】:2020-02-05 08:46:53
【问题描述】:

我有这个正则表达式:(?:\[|\G(?!^))('[^']+?')\s*,?\s*(?=[^\]]*?\]),它只匹配方括号内引号之间的内容(如数组):['Foo', 'Bar'] => 返回'Foo' 'Bar'

问题在于,在这种情况下,单引号是一个特殊字符,因为它被正则表达式用作分隔符,但有时我需要将值内的单引号作为转义字符传递:['F'oo', 'B'ar'] .

我正在尝试通过将这个非捕获(?:(?=(\\?))\1.) 组调整为正则表达式来执行类似“F\'oo”的操作,但它不起作用,我尝试了许多不同的方法。

这个非捕获组正则表达式来自这个answer,他成功地使用反斜杠来转义特殊字符。

我将 C# 与 .NET Core 结合使用。

全文类似于:eq('Property', ['F'oo', 'Ba'r', '123'])

如何解决?

【问题讨论】:

  • 不能只使用'.+?' 来清除分隔符,那样不行。彼得罗德的['F'o''o',',',',',',','ar'].

标签: .net regex


【解决方案1】:

我的猜测是,也许,

(?<=\[|,)\s*'(.*?)'\s*(?=\]|,)

或一些类似的表达可能会正常工作。

Demo

测试

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"(?<=\[|,)\s*'(.*?)'\s*(?=\]|,)";
        string input = @"['Foo', 'Bar']
['F'oo', 'B'ar']
['F'oo', 'B'ar','Foo', 'Bar']";
        RegexOptions options = RegexOptions.Multiline;
        
        foreach (Match m in Regex.Matches(input, pattern, options))
        {
            Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
        }
    }
}

正则表达式电路

jex.im 可视化正则表达式:

【讨论】:

  • 感谢您的回答!这也是一些很好的解决方案!我需要的唯一缺少的是仅在存在方括号时匹配元素(在全文中),这样我就可以强制执行语法。除此之外,你搞定了!谢谢!
【解决方案2】:

有一个similar question already 用于获取引用的转义字符。我更喜欢this answer

将捕获部分 ('[^']+?') 更改为 ('[^\\']*(?:\\.[^\\']*)*')。您可以进一步删除惰性量词,这在已经使用否定类时不会产生太大影响。

可能需要做额外的escaping of the backslash

【讨论】:

  • 您的解决方案很棒!完全按照我的要求做!唯一与接受的答案不同的是需要反斜杠。谢谢!
  • @MurariAlex 谢谢 :) 是的,我就是这样理解这个问题的。处理单引号字符串中的反斜杠转义单引号。很好,您找到了适合您需求的解决方案!
【解决方案3】:

你可以使用

(?:\[|\G(?!\A))
('.+?')
(?:(?:\s*,\s*)|\])

a demo on regex101.com

【讨论】:

  • 优秀的解决方案!您不仅保留了仅在方括号内匹配项目的基本前提,而且更进一步并提供了一个解决方案,该解决方案无需使用反斜杠来转义引号。谢谢!
猜你喜欢
  • 1970-01-01
  • 2010-12-22
  • 2010-09-21
  • 2020-07-24
  • 1970-01-01
相关资源
最近更新 更多