【问题标题】:Regular expression match doesn't include space正则表达式匹配不包含空格
【发布时间】:2011-12-15 19:16:12
【问题描述】:

我有这个正则表达式:

(?'box_id'\d{1,19})","box_name":"(?'box_name'[\w\d\.\s]{1,19})

这很好用,除非框名包含空格。例如,在my box 上执行它时,它返回mybox,没有空格。

如何使它在box_name 组中包含空格?

代码:

Regex reg = new Regex(@"""object_id"":""(?<object_id>\d{1,19})"",""file_name"":""(?<file_name>[\w.]+(?:\s[\w.]+)*)""");
MatchCollection matches = reg.Matches(result);
if ( matches == null) throw new Exception("There was an error while parsing data."); 
if ( matches.Count > 0 )
{
  FileArchive.FilesDataTable filesdataTable = new FileArchive.FilesDataTable();
  foreach ( Match match in matches )
  {
    FileArchive.FilesRow row = filesdataTable.NewFilesRow();
    row.ID = match.Groups["object_id"].Value;
    row.Name = match.Groups["file_name"].Value;
  }
}

输入:

{"objects":[{"object_id":"135248","file_name":"some space here.jpg","video_status":"0","thumbnail_status":"1"},{"object_id ":"135257","file_name":"jup 13.jpg","video_status":"0","thumbnail_status":"1"},{"object_id":"135260","file_name":"我的图片.jpg","video_status":"0","thumbnail_status":"1"},{"object_id":"135262","file_name":"EveningWav)es,Hon(olulu,Hawaii.jpg","video_status ":"0","thumbnail_status":"1"},{"object_id":"135280","file_name":"用空格测试.jpg","video_status":"0","thumbnail_status":"1 "}],"状态":"ok"}

【问题讨论】:

  • 你能给我们一些你试图解析的字符串的例子吗?
  • 类似:{"objects":[{"object_id":"135260","file_name":"my pic.jpg","video_status":"0","thumbnail_status":" 1"},{"object_id":"135261","file_name":"New Text Document.txt","video_status":"0","thumbnail_status":"0"}],"status":"ok" }
  • 这里有两个文件名,my pic.jpg 和 New Text Document.txt
  • 呃,如果这是json,为什么不用json解析库呢?
  • 我需要特殊需求,JSON 库很好,但这里不是一个选项。

标签: c# regex regex-group


【解决方案1】:

在我看来,您的数据始终是双引号分隔的,不是吗?这个事实应该是正则表达式的基础:

(?<box_id>\d{1,19})","file_name":"(?<box_name>[^"]{1,19})  //1 to 19 non " chars.

就缺少空格而言,此标记 (?'box_name'[\w\d.\s]{1,19}) 无法匹配包含 'my box' 的字符串上的 'mybox',因此问题必须在下游。

错别字和风格:你有文字'box_name',但标记是'file_name'。此外,当 括号(默认值)更具可读性(因为引号在正则表达式中!)时,为什么你会切换到使用单引号作为命名组分隔符!

【讨论】:

  • 感谢您的明确答复。至于双引号,是的,我所有的字符串都是双引号,为了简单起见,我只是在这里删除了,我还把所有的 ' 都改成了 ,你说得对,它更好,是的,它的 box_name,我在 file_name 上犯了一个错误。但是,当我替换您的 [^"] 方法时,我的空间问题仍然存在,也许问题出在其他地方,但这就是 Matches 集合给我的。
  • @user1091560 - 最大的问题是没有发布准确的正则表达式和源字符串。那是因为这需要的正则表达式非常简单。贴出相关代码。
【解决方案2】:

除了@sweaver2112 所说的之外,我认为您需要通过添加引号来扩展框架并摆脱 {1,19} 范围。

这些正则表达式在 Perl 中的工作,我不想启动 C# 来测试它。

"(?&lt;box_id&gt;\d+)","(?:${type})":"(?&lt;box_name&gt;[\w.]+(?:\s[\w.]+)*)"
或者,
"\s*(?&lt;box_id&gt;\d+)\s*","\s*(?:${type})\s*":"\s*(?&lt;box_name&gt;[\w.]+(?:\s[\w.]+)*)\s*"
其中 $type = 'file_name';

实际上,这也应该有效(类型被替换)。它的验证很宽松。
"(?&lt;box_id&gt;\d+)","file_name":"(?&lt;box_name&gt;[^"]*)"

编辑

“不确定,我的正则表达式返回给你什么? – sln 昨天
它返回了正确的结果,在我的问题的输入中,我得到了 file_name 组的 'somespacehere.jpg' 'jup13.jpg' 等等。 – NET 开发人员昨天”

我获取了您的代码和输入,然后打印了组,效果很好。空间在那里,
将其分配给您的 ROW 数据一定有问题。

看这里http://www.ideone.com/HsTMF

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      string input = @"{""objects"":[{""object_id"":""135248"",""file_name"":""some space here.jpg"",""video_status"":""0"",""thumbnail_status"":""1""},{""object_id"":""135257"",""file_name"":""jup 13.jpg"",""video_status"":""0"",""thumbnail_status"":""1""},{""object_id"":""135260"",""file_name"":""my pic.jpg"",""video_status"":""0"",""thumbnail_status"":""1""},{""object_id"":""135262"",""file_name"":""EveningWav)es,Hon(olulu,Hawaii.jpg"",""video_status"":""0"",""thumbnail_status"":""1""},{""object_id"":""135280"",""file_name"":""test with spaces.jpg"",""video_status"":""0"",""thumbnail_status"":""1""}],""status"":""ok""}";
      Regex reg = new Regex(
                   @"""object_id"":""(?<object_id>\d{1,19})"",""file_name"":""(?<file_name>[\w.]+(?:\s[\w.]+)*)"""
      );
      foreach ( Match match in reg.Matches(input) )
         Console.WriteLine(
                 "Id = '{0}',  File name = '{1}'", 
                 match.Groups["object_id"].Value,
                 match.Groups["file_name"].Value  );
   }
}

输出:

Id = '135248',  File name = 'some space here.jpg'
Id = '135257',  File name = 'jup 13.jpg'
Id = '135260',  File name = 'my pic.jpg'
Id = '135280',  File name = 'test with spaces.jpg'

【讨论】:

  • 好的,谢谢,好点,正则表达式是否有可能匹配“我的盒子”但将“我的盒子”返回给我?如果不是,我认为我的正则表达式工作正常,我必须在其他地方寻找这个问题。也可以是正则表达式选项吗?
  • 不确定,我的正则表达式返回给你什么?
  • 它返回了正确的结果,在我的问题的输入中我得到了 file_name 组的 'somespacehere.jpg' 'jup13.jpg' 等等。
  • @NET Developer - 不行,有空格,试试我编辑中添加的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-19
  • 1970-01-01
  • 2020-08-30
  • 2017-04-05
相关资源
最近更新 更多