我需要捕获相同模式的多个组.假设,我有一个以下字符串:
HELLO,THERE,WORLD
Run Code Online (Sandbox Code Playgroud)
我写了一个以下模式
^(?:([A-Z]+),?)+$
Run Code Online (Sandbox Code Playgroud)
我想要它做的是,捕获每一个单词,以便第1组是:"你好",第2组是"THERE"而第3组是"WORLD"我的正则表达式实际上只捕获最后一个,这是"世界".
我测试我的正则表达式在这里,我想与斯威夫特使用它(也许有斯威夫特一种方式来获得中间结果不知怎么的,这样我就可以使用它们?)
更新:我不想使用split
.我现在只需要捕获所有匹配模式的组,而不仅仅是最后一组.
当我在PHP中测试时,我有这个正则表达式工作,但它在Objective C中不起作用:
(?:www\.)?((?!-)[a-zA-Z0-9-]{2,63}(?<!-))\.?((?:[a-zA-Z0-9]{2,})?(?:\.[a-zA-Z0-9]{2,})?)
Run Code Online (Sandbox Code Playgroud)
我试图逃避转义字符,但这也无济于事.我应该逃避任何其他角色吗?
这是我在Objective C中的代码:
NSMutableString *searchedString = [NSMutableString stringWithString:@"domain-name.tld.tld2"];
NSError* error = nil;
NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:@"(?:www\\.)?((?!-)[a-zA-Z0-9-]{2,63}(?<!-))\\.?((?:[a-zA-Z0-9]{2,})?(?:\\.[a-zA-Z0-9]{2,})?)" options:0 error:&error];
NSArray* matches = [regex matchesInString:searchedString options:0 range:NSMakeRange(0, [searchedString length])];
for ( NSTextCheckingResult* match in matches )
{
NSString* matchText = [searchedString substringWithRange:[match range]];
NSLog(@"match: %@", matchText);
}
Run Code Online (Sandbox Code Playgroud)
- 更新 -
此正则表达式返回(在PHP中)具有值"domain-name"和"tld.tld2"的数组,但在Objective C中,我只获得一个值:"domain-name.tld.tld2"
- 更新2 -
此正则表达式从字符串中提取"域名"和"TLD":
它采用有效的域名(不以' - '开头或结尾,长度在2到63个字符之间),如果部分有效,则最多为TLD的两个部分(至少两个字符只包含字母和数字)
希望这个解释有所帮助
为什么此代码仅吐出整个正则表达式匹配而不是捕获组?
输入
@"A long string containing Name:</td><td>A name here</td> amongst other things"
Run Code Online (Sandbox Code Playgroud)
预期产出
A name here
Run Code Online (Sandbox Code Playgroud)
实际输出
Name:</td><td>A name here</td>
Run Code Online (Sandbox Code Playgroud)
码
NSString *htmlString = @"A long string containing Name:</td><td>A name here</td> amongst other things";
NSRegularExpression *nameExpression = [NSRegularExpression regularExpressionWithPattern:@"Name:</td>.*\">(.*)</td>" options:NSRegularExpressionSearch error:nil];
NSArray *matches = [nameExpression matchesInString:htmlString
options:0
range:NSMakeRange(0, [htmlString length])];
for (NSTextCheckingResult *match in matches) {
NSRange matchRange = [match range];
NSString *matchString = [htmlString substringWithRange:matchRange];
NSLog(@"%@", matchString);
}
Run Code Online (Sandbox Code Playgroud)
代码取自Apple文档.我知道还有其他库可以做到这一点,但我想坚持使用内置的任务.
我必须检测字符串是否包含任何特殊字符.我怎么检查呢?Swift是否支持正则表达式?
var characterSet:NSCharacterSet = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ0123456789")
if (searchTerm!.rangeOfCharacterFromSet(characterSet).location == NSNotFound){
println("Could not handle special characters")
}
Run Code Online (Sandbox Code Playgroud)
我尝试了上面的代码,但只有当我输入第一个字符作为特殊字符时它才匹配.
我收到了一个奇怪的警告,因此我的正则表达式搜索无效.这是行:
NSRange r = [HTML rangeOfString:@"\|(.*)\|" options:NSRegularExpressionSearch];
Run Code Online (Sandbox Code Playgroud)
哪个HTML
字符串我确定包含上述正则表达式的单个匹配项.
警告仅在第一次出现"\ |"时出现,而不是两者都出现.
任何帮助深表感谢!
我正在学习在iOS的正则表达式,看到这个教程:http://www.raywenderlich.com/30288/nsregularexpression-tutorial-and-cheat-sheet
对于\ b,它读起来像这样:
\ b匹配单词边界字符,如空格和标点符号.to\b将匹配"to the moon"和"to!"中的"to",但它与"明天"不匹配.\ b对于"全字"类型匹配很方便.
和\ s:
\ s匹配空格,制表符和换行符等空格字符.你好\ s将在"嗯,你好!"中匹配"你好".
我有两个问题:
1) what is the difference between \s and \b? when to use which?
2) \b is handy for "whole word" type matching -> Don't understand the meaning..
需要一些关于这两个的指导.
我在我的iPhone应用程序上使用以下代码,从这里获取条带.html代码中的所有URL.
我只能提取第一个URL,但我需要一个包含所有 URL 的数组.我的NSArray没有为每个URL返回NSStrings,只返回对象描述.
如何arrayOfAllMatches
以NSStrings的形式返回所有网址?
-(NSArray *)stripOutHttp:(NSString *)httpLine {
// Setup an NSError object to catch any failures
NSError *error = NULL;
// create the NSRegularExpression object and initialize it with a pattern
// the pattern will match any http or https url, with option case insensitive
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"http?://([-\\w\\.]+)+(:\\d+)?(/([\\w/_\\.]*(\\?\\S+)?)?)?" options:NSRegularExpressionCaseInsensitive error:&error];
// create an NSRange object using our regex object for the first match in the string httpline
NSRange rangeOfFirstMatch = [regex …
Run Code Online (Sandbox Code Playgroud) 我试图从UNKNOWN格式的NSString中获取NSDate ,所以我写了一个类似下面的函数
-(void)dateFromString:(NSString*)string {
NSError *error = NULL;
NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:(NSTextCheckingTypes)NSTextCheckingTypeDate error:&error];
NSArray *matches = [detector matchesInString:string
options:0
range:NSMakeRange(0, [string length])];
NSLocale* currentLoc = [NSLocale currentLocale];
for (NSTextCheckingResult *match in matches) {
if ([match resultType] == NSTextCheckingTypeDate) {
NSLog(@"Date : %@", [[match date] descriptionWithLocale:currentLoc]);
}
}
}
Run Code Online (Sandbox Code Playgroud)
除了一个地方外,它运作良好.
如果我调用
[self dateFromString:@"6/12"];
Run Code Online (Sandbox Code Playgroud)
它打印
日期:2014年6月12日,星期四,澳大利亚东部标准时间下午12:00:00
如果我打电话的话
[self dateFromString:@"13/12"];
Run Code Online (Sandbox Code Playgroud)
它打印
日期:2013年12月13日星期五下午12:00:00澳大利亚东部夏令时间
基本上,我希望函数表现一致.由于我住在澳大利亚,它应该在12月6日返回首次执行.第二次通话结果是正确的.
我在这做错了什么?
我无法NSRegularExpression
在字符串上匹配模式,其中包含更宽的(?)Unicode字符.看起来问题是范围参数--Swift计算单个Unicode字符,而Objective-C将字符串视为由UTF-16代码单元组成.
这是我的测试字符串和两个正则表达式:
let str = "dogcow"
let dogRegex = NSRegularExpression(pattern: "d.g", options: nil, error: nil)!
let cowRegex = NSRegularExpression(pattern: "c.w", options: nil, error: nil)!
Run Code Online (Sandbox Code Playgroud)
我可以匹配第一个正则表达式没有问题:
let dogMatch = dogRegex.firstMatchInString(str, options: nil,
range: NSRange(location: 0, length: countElements(str)))
println(dogMatch?.range) // (0, 3)
Run Code Online (Sandbox Code Playgroud)
但是第二个失败了相同的参数,因为我发送它的范围(0 ... 7)不足以涵盖整个字符串,只要NSRegularExpression
有关:
let cowMatch = cowRegex.firstMatchInString(str, options: nil,
range: NSRange(location: 0, length: countElements(str)))
println(cowMatch.range) // nil
Run Code Online (Sandbox Code Playgroud)
如果我使用不同的范围,我可以使匹配成功:
let cowMatch2 = cowRegex.firstMatchInString(str, options: nil,
range: NSRange(location: 0, length: str.utf16Count))
println(cowMatch2?.range) // (7, 3)
Run Code Online (Sandbox Code Playgroud)
但后来我不知道如何从字符串中提取匹配的文本,因为该范围超出了Swift字符串的范围.
是否NSRegularExpression
支持命名捕获组?它从文档中看起来不像,但我想在探索替代解决方案之前进行检查.
regex ×9
objective-c ×7
ios ×6
swift ×3
cocoa ×1
iphone ×1
nsarray ×1
nsdate ×1
nsstring ×1
regex-greedy ×1
regex-group ×1