我写了一个小程序来查找字符串中的字符串,到目前为止工作正常。但是我有一个NSRegularExpression的问题 - 我的特殊情况需要正确的模式而且卡住了。
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
我已尝试使用不同的RegExp,如您所见:"?trunk /%@ /%@ / + \([a-zA-Z0-9 _ \ - \。])+ / Host-1",但我似乎仍然无法工作,也许有人可以帮助我。
当我使用以下代码构建模式时,可能存在一个问题:
NSString *strRegExp = [NSString stringWithFormat:@"?trunk/%@/%@/+\\([a-zA-Z0-9_\\-\\.])+/Host-1", inputstrse , inputstrsno];
稍后使用它:
regularExpressionWithPattern:strRegExp
我希望有人可以帮助我 - 我是RegularExpressions的新手。
答案 0 :(得分: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
它执行以下操作:
trunk\/test\/1\/
:匹配常量字符串trunk/test/1/
(反斜杠是转义符)[0-9]*-
:匹配任意数字后跟-
[a-zA-Z]*-
:匹配任意数量的字母,后跟-
[a-zA-Z]*
:匹配任意数量的字母\/Host-1
:匹配常量字符串/Host-1/
以下是RegExr的链接,如果您想尝试不同的输入数据或对正则表达式进行更改,可以使用这些链接:http://regexr.com/39tgn
评论中提供了以下字符串:trunk\test\/1\/.*\/Host-1
。它不那么严格,但也能完成这项工作。
答案 1 :(得分:-1)
我不知道Objective-C,但是你的正则表达式有一些奇怪的东西,如果我删除那些我得到的东西,我认为你想要实现。
你的第一个字符是?
,它不是,它是正则表达式中的量词,表示前面的字符(或类或组)。如果它是第一个字符,则没有前面的字符。
/+\\
< - 不确定您在此处尝试做什么,但这意味着'1或更多/
后跟\
'
[a-zA-Z0-9_\\-\\.]
可以更短,例如:[\w.-]
,如果将+
放在括号内,它将捕获捕获组1中的整个未知字符串。
来自评论:所以%@
是一个变量文本,第一个始终只是字母,第二个只是数字。正则表达式中分别为[a-zA-Z]+
和\d+
。但实际上我会使用[^/]+
(任何不是/
的字符),以便当有人在此路径中放置不同的字符(例如trunk/this_text/4/.../Host-1
时,代码不会中断) _
。
这使得(在评论后更改):
trunk/[^/]+/[^/]+/([\w.-]+)/Host-1
现在注意这是没有转义以获取正确的字符串进入正则表达式引擎,但如果Objective-C类似于C#,那么以@"..."
开头的字符串不需要漏出。