【问题标题】:NSRegularExpression - Probleme with a PatternNSRegularExpression - 有问题的模式
【发布时间】:2015-01-11 18:54:00
【问题描述】:

我编写了一个小程序来在一个字符串中查找一个字符串,到目前为止它工作得很好。但我对 NSRegularExpression 有疑问 - 我需要适合我的特殊情况的 Pattern 并且卡住了。

NSString *strRegExp = [NSString stringWithFormat:@"?trunk/%@/%@/+\\([a-zA-Z0-9_\\-\\.])+/Host-1", inputstrse , inputstrsno];

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:strRegExp options:        NSRegularExpressionCaseInsensitive error:NULL];

NSArray *arrayOfAllMatches = [regex matchesInString:inputurl options:0 range:NSMakeRange(0, [inputurl length])];

NSRegularExpression 模式应该匹配如下字符串:

trunk/%@/%@/some-text-1/Host-1
trunk/test/1/5-text-text/Host-1

trunk/%@/%@/ 和 /Host-1 始终保持不变。只有中间的部分是可变的,并且总是如下所示:

NUMBER-Some-Text -> 5-Hello-World -> /trunk/test/1/5-hello-world/Host-1

我已经尝试过使用不同的正则表达式,如您在此处看到的:"?trunk/%@/%@/+\([a-zA-Z0-9_\-\.])+/Host-1",但我似乎仍然无法工作,也许有人可以帮助我。

当我使用以下方法构建模式时可能会出现问题:

 NSString *strRegExp = [NSString stringWithFormat:@"?trunk/%@/%@/+\\([a-zA-Z0-9_\\-\\.])+/Host-1", inputstrse , inputstrsno];

然后像这样使用它:

regularExpressionWithPattern:strRegExp

我希望有人可以帮助我 - 我是正则表达式的新手。

【问题讨论】:

  • 你的输入是什么样的?
  • inputse 类似于:Hello-Test-1 或 Hallo 或 Hallo-1 inputno 只是 1-30 之间的数字 inputurl 是来自网站的纯 html 代码。
  • 所以你有一堆文字,想挑出看起来像/trunk/test/1/5-hello-world/Host-1的部分?
  • 正确的是“5-hello-world”部分总是在变化,但看起来很相似,它也是一个数字,后跟一个“-”,后跟一些文本,可能再跟一个“-”和文本几次.
  • 好的,会发布答案

标签: objective-c regex nsstring nsregularexpression


【解决方案1】:

通常,将正则表达式表示为“我想匹配多个字母,然后是破折号,然后是数字”等等是构造一个正则表达式的最简单方法。此外,使用http://www.regexr.com 之类的工具会大大简化。

据我了解,您希望匹配以下内容:

trunk/test/1/[some number]-[some text]-[some other text]/Host-1

如果是这样,那么下面的正则表达式应该把它删掉:

trunk\/test\/1\/[0-9]*-[a-zA-Z]*-[a-zA-Z]*\/Host-1

它执行以下操作:

  1. trunk\/test\/1\/:匹配常量字符串trunk/test/1/(反斜杠为转义)
  2. [0-9]*-:匹配任意数量的数字,后跟-
  3. [a-zA-Z]*-:匹配任意数量的字母,后跟-
  4. [a-zA-Z]*:匹配任意数量的字母
  5. \/Host-1:匹配常量字符串/Host-1/

这里是 RegExr 的链接,如果您想尝试不同的输入数据或更改正则表达式,可以使用该链接:http://regexr.com/39tgn

在 cmets 中提供了以下字符串:trunk\test\/1\/.*\/Host-1。它不那么严格,但也能胜任。

【讨论】:

  • 非常感谢 - 知道了! :)
  • 最后一件事:它可以工作,但有一个问题:trunk/test/1/[some number]-[some text]-[some other text]/Host-1 适用于trunk \/test\/1\/[0-9]*-[a-zA-Z]*-[a-zA-Z]*\/Host-1 但在某些情况下有两个以上 [some text]像这样的区域:trunk/test/1/[一些数字]-[一些文本]-[一些其他文本]-[一些其他文本]/Host-1 它的范围从只有 1 个 [一些文本] 部分到 10 - 什么可以我会用一个 RegExp 匹配所有案例吗?
  • 让它与“trunk\/%@\/%@\/.*\/Host-1”一起工作。谢谢!
  • 很高兴听到它对您有用!如果有效,请将我的答案标记为已接受。 :) 我会用你提供的新字符串更新它。
【解决方案2】:

我不了解 Objective-C,但你的正则表达式有很多奇怪之处,如果我删除那些我会得到一些我认为你想要实现的东西。

您的第一个字符是?,这不可能,它是正则表达式中的量词,它说明了前面的字符(或类或组)。如果是第一个字符,则没有前面的字符。

/+\\ '1 或更多 / 后跟 \'

[a-zA-Z0-9_\\-\\.] 可以写得更短,例如:[\w.-],如果您将 + 放在括号内,它将捕获捕获组 1 中的整个未知字符串。

来自 cmets: 所以%@ 是一个可变文本,第一个总是只是字母,第二个总是只是数字。那将是正则表达式中的[a-zA-Z]+\d+。但实际上我会使用[^/]+(任何不是/ 的字符),这样当有人在此路径中放置一个不同的字符(如trunk/this_text/4/.../Host-1)时代码不会中断,这会在_ 上中断。

结合这使得(在cmets之后改变)

trunk/[^/]+/[^/]+/([\w.-]+)/Host-1

Debuggex Demo

现在请注意,这是无需转义即可将正确的字符串输入正则表达式引擎,但如果 Objective-C 与 C# 类似,则以 @"..." 开头的字符串不需要转义。

【讨论】:

  • 非常感谢您的出色回答!!! trunk/test/1/5-text-text/Host-1 是 应该 匹配的文本。总是一样的:statictext/varitext/varinumber/RandomTextNumbersAnd-/statictext。
  • @MillerPI 相应地改变了答案:)
  • 仍然无法正常工作 - 为了更清楚地说明字符串只有 1 个未知部分。 /KnownTextStatic/KnownTextThatcomesFromVariable/KnownNumberThatComesFromVariable/UnknownPart/KnownTextStatic 其中 UnkownPart 是一个字符串,其中包含从 1 到 30 的数字、大小写字符和减号(“-”)。所以我需要一个匹配 sometext/UNKNOWN/sometext 的模式,如上所述。希望这现在清楚了
  • 得到它:“trunk\/%@\/%@\/.*\/Host-1” 感谢您的帮助!
  • 我不知道,它看起来对我有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
  • 2011-10-31
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多