【问题标题】:Getting matching result using Regex使用正则表达式获取匹配结果
【发布时间】:2020-02-04 10:48:53
【问题描述】:

我需要找到匹配的结果,即使用正则表达式的字符串。让我使用示例输入来演示场景。

string input= "xb-cv_107_20190608_032214_006";          // <-1st case
string input = "yb-ha_107_20190608_032214_006__foobar"; // <-2nd case
string input= "fv_vgf_ka01mq3286__20190426_084135_039"; // <-3rd case
string input="fv_vgf_ka01mq3286__2090426_084135_039"; //<-4th case

对于第一种情况输入,需要输出=“xb-cv_107_20190608_032214_006”。
对于第二种情况输入,需要输出=“yb-ha_107_20190608_032214_006”。
对于第 3 种情况输入,需要输出 = "fv_vgf_ka01mq3286__20190426_084135_039"。
对于第 4 种情况的输入,输出 required= null 因为模式不匹配。

获取输出的过程是:

  • 使用正则表达式检查模式是否以 _ 后跟 8 位小数后跟“_”结尾 后跟 6 位小数,后跟 3 位小数
  • 或者使用正则表达式检查模式是否以 _ 后跟 8 位小数后跟 _ 后跟 6 位小数后跟 3 位小数后跟 __ 后跟任何随机结尾。

到目前为止,我已经想出了这个正则表达式:

string pattern = @".+[_][0-9]{8}[_][0-9]{6}[_][0-9]{3}([_]{2})?";
var result = Regex.Match(input, pattern)?.Groups[0].Value ;

【问题讨论】:

  • 好吧,不..输出是在忽略 __ 之后的部分后出现的,如果它存在,则它与输入相同
  • 看来你需要var result = Regex.Replace(input, @"^(.+_[0-9]{8}_[0-9]{6}_[0-9]{3})__.*$", "$1");
  • @WiktorStribiżew 它的工作原理谢谢..你可以添加作为这个问题的答案

标签: c# regex


【解决方案1】:

你可以使用

var result = Regex.Match(input, @"^(.+_[0-9]{8}_[0-9]{6}_[0-9]{3})__")?.Groups[1].Value;

正则表达式详细信息

  • ^ - 字符串开头
  • ( - 第 1 组开始:
    • .+ - 除 LF 之外的任何 1+ 个字符,尽可能多
    • _[0-9]{8}_[0-9]{6}_[0-9]{3} - _,8 位,_,6 位,_,3 位
  • ) - 第 1 组结束
  • __ - 两个下划线。

如果有匹配项,result 会保存第 1 组中的值。

如果没有匹配,resultnull

【讨论】:

  • 既然您使用的是 Regex.Replace ;有什么方法可以确认输入和模式的匹配是否成功。如果匹配不成功,我需要替换为“null”。
  • 对不起,但这无济于事,因为两种情况下的结果都是一样的:1)输入与模式不匹配 2)输入与模式完全匹配
  • 例如,当 input="lb-aa_107_20190608_32214_006" 结果将与输入相同。
  • @user11708636 好的,这是您的问题要求。现在,你要求别的东西,现在你想简单地提取这个值。只需使用var result = Regex.Match(input, @"^(.+_[0-9]{8}_[0-9]{6}_[0-9]{3})__")?.Groups[1].Value;
  • 是的,谢谢,抱歉给您带来了困惑..也许您可以编辑答案。我会将其标记为正确,以便其他人有所帮助。
猜你喜欢
  • 2016-11-10
  • 1970-01-01
  • 2012-11-29
  • 2015-07-06
  • 2020-10-03
  • 2016-11-07
  • 2022-12-09
  • 1970-01-01
  • 2017-12-04
相关资源
最近更新 更多