Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何将前一个元素获取零次或多次,但次数越少越好?_Regex - Fatal编程技术网

Regex 如何将前一个元素获取零次或多次,但次数越少越好?

Regex 如何将前一个元素获取零次或多次,但次数越少越好?,regex,Regex,我的输入是:abc1 abc2 abc3 abc4 我不想得到a,也不想得到任何字符,但要尽可能少地得到3 输出必须以a开始,并以世界上的每个字符继续,除了与a对应的字符外,以3结束,其中a是Regax表达式 但是如果我使用模式:a.*3,匹配的是:abc1 abc2 abc3,但我希望abc3 我不能使用a[^a]*?3,因为a事先是未知的 如何在.NET正则表达式中实现这一点?您希望匹配一些通用模式,然后匹配任何与值模式不匹配的文本,直到右分隔符模式的最左边出现 在这种情况下,你需要做什么

我的输入是:
abc1 abc2 abc3 abc4

我不想得到
a
,也不想得到任何字符,但要尽可能少地得到
3

输出必须以
a
开始,并以世界上的每个字符继续,除了与
a
对应的字符外,以
3
结束,其中
a
是Regax表达式

但是如果我使用模式:
a.*3
,匹配的是:
abc1 abc2 abc3
,但我希望
abc3

我不能使用
a[^a]*?3
,因为
a
事先是未知的


如何在.NET正则表达式中实现这一点?

您希望匹配一些通用模式,然后匹配任何与值模式不匹配的文本,直到右分隔符模式的最左边出现

在这种情况下,你需要做什么

  • 将起始模式分成一组
  • 使用对组值的反向引用作为负的先行模式,确保量词是非贪婪的
下面是一个示例,其中
a
起始分隔符模式被混淆为
(?![b-z])[a-z]

((?![b-z])[a-z])(?:(?!\1).)*?3
看。所以,它是匹配的

  • ((?![b-z])[a-z])
    -捕获组1:任何小写ASCII,但从
    b
    z
    范围的字母(基本上是
    a
  • (?:(?!\1)。*?
    -任何字符(换行字符除外),不启动存储在组1中的值的0次或多次出现(但尽可能少)
  • 3
    -右侧分隔符,
    3

    • 为什么不
      \w
      \S
      而不是
      ?你说“a事先不知道”,那是什么?如果你有
      (\w+)
      ,那么使用
      (?:(?!\1)。*
      你可以做
      *(a.*3)
      。期望的结果将在第1组中。您能告诉我您期望的结果吗?当你说-
      a和任何字符时,你都不是很清楚,但要尽可能少地说,3
      可能是这样的:
      \ba\S*?3
      @404 in
      abc1 abc2 abc3 abc4,abc1 abc2 abc3 abc4
      我只得到最后一个
      abc3