【问题标题】:JS RegEx for C# "lambda syntax"用于 C#“lambda 语法”的 JS RegEx
【发布时间】:2016-04-04 08:02:14
【问题描述】:
/^[a-z][ ][=][>][ ][a-z?][.?][a-z0-9]+[ ][=][ ]['?][a-z0-9]+['?]]/i  

我正在试图弄清楚如何获得一个能够识别一串 lambda 语法(在 c# 中使用)的 rexex 模式

字符串的情况

"p => p = 'some random string'" //Must alow for single quotes  

数字或布尔值的情况

"p => p = true" /*or*/ "p => p = 25"  //Must allow for a string without single quotes with no whitespace at all in the event there are no single quotes  

它还必须允许使用单个 '.'在“=”符号左侧选择的字母中

"p => p.firstName = 'Jack'"  

如何修改我的正则表达式以满足以下要求

  1. 从任何字母开始
  2. 后跟必填空格
  3. 后跟强制字符串“=>”(不带单引号)
  4. 后跟一个必填空格
  5. 后跟步骤 1 中的相同字母(或至少一个字符)
  6. 后跟句点字符(可选)
  7. 后跟任何一组字母数字字符(如果步骤 6 中有句点,则需要)
  8. 后跟一个空格
  9. 后跟等号
  10. 后跟一个空格
  11. 后跟任何字母数字字符集和单引号(但仅当单引号包含字母数字字符集时)

【问题讨论】:

  • static bool greaterThanTwo(int arg) 是一个谓词。你的意思是 lambda 谓词:List<int> newList = list.FindAll(i => i > 2);
  • 我的错误。已更正。

标签: javascript regex


【解决方案1】:

首先,您不需要[] 围绕所有内容,只需要字符类(例如[a-zA-Z][_\$0-9])。

让我们按顺序完成您的步骤:

  • 匹配任何字母 - 你不指定大小写,让我们两者都做:
    • 仅小写:([a-z])
    • 仅大写:([A-Z])
    • 两者:([a-zA-Z])
    • 我们将其包装在 () 中,以便稍后在反向引用中使用它。
  • 强制字符串=>(合并步骤2-4)就是这样,字面意思是:=>。由于这些都不是特殊字符,因此无需转义。
  • 为了获得与步骤 1 相同的字母,我们在第一组(() 的集合)中插入一个反向引用:\1
  • 对于第 6 步和第 7 步,我们将句点和一个字母数字字符作为可选字符:(\.\w)?,然后是零个或多个字母数字字符:\w*
  • 现在我们有了文字字符串=,这些字符都不需要转义,所以我们直接包含它:=
  • 对于最后一步,我们有几个选项:
    • 一些没有空格的数字字符:\d+
    • 对还是错
    • 或者,单引号,除单引号外的任何字符,然后再次单引号:'[^']*'(我们使用否定字符类来获取所有内容'
    • 现在我们使用| 将这些组合在一起作为替代方案

将所有这些放在一起,我们得到了最终的正则表达式:

/([a-zA-Z]) => \1(\.\w)?\w* = (\d+|true|false|'[^']*')/i

【讨论】:

  • 感谢 Tuomas。这几乎让我到达那里。这与结束单引号不匹配,并且在我们不使用单引号的情况下,它匹配除真或假之外的字母字符。我会将您标记为正确,但我想尝试弄清楚如何更改您的正则表达式以使其 100% 正确
  • 我在您的最终正则表达式中发现了错误。您只是忘记在* 之后添加'
  • @Adrian 修复了这个问题,抱歉是错字。
  • 我将其修改为也接受小数 /([a-zA-Z]) => \1(\.\w)?\w* = (\d+[.]?\d+|true|false|'[^']*')/i
  • @Adrian 那[.]? 可以只是\.?。除非你喜欢把它们放在 char 类中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-10
  • 2016-10-25
  • 1970-01-01
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多