TL;DR:我想分析一个文本文件,并判断每一行是否有正确的格式/语法.此外,我想提取一些子字符串.有没有可能只用一个NSRegularExpression就能同时做到这一点?

Details:个 假设每行只包含一个包含不同单词的"句子",例如"Word1 Word2 LastWord".

正则表达式^((\w+) ?)+\.$将匹配该字符串,并因此判断格式.但是,它将返回以下三个捕获组/范围: Word1 word2 LastWord.LastWordLastWord,而我希望/要求它返回Word1 word2 LastWord.Word1word2LastWord.

当然,使用两个RegEx不成问题,一个用于判断格式,另一个用于提取单词.然而,我想知道我是否做错了什么,或者这是否是RegEx的总体限制?

推荐答案

使用基于SWIFT ICU的正则表达式无法做到这一点,因为捕获组不包含所有捕获,它们只保留最后捕获的数据.

但是,您可以使用另一种方法.您可以使用multiple matching approach,并在开始时以正向前视的形式实现验证.然后,您将只匹配和捕获传递文本的字符串的后续部分.

当前场景的正则表达式示例如下

(?:\G(?!^) |^(?=\w+(?: \w+)*\.$))(\w+)
(?:\G(?!^)\s+|^(?=\w+(?:\s+\w+)*\.$))(\w+)

第一个正则表达式只允许单词之间有一个规则的空格,第二个regex允许单词之间有一个或多个空格.

请参见regex #2 demo.com/r/4yK2Ti/1" rel="nofollow noreferrer">regex #1 demo和regex #2 demo.

Details

  • (?:\G(?!^)\s+|^(?=\w+(?:\s+\w+)*\.$)) - either of the two:
    • \G(?!^)\s+-只有在前一个匹配成功的情况下才有一个或多个空格(请注意,\G匹配字符串的开头或前一个匹配的结尾,因此必须超前(?!^))
    • |-或
    • ^(?=\w+(?:\s+\w+)*\.$)-字符串only的开始,如果紧靠右侧有一个或多个单词字符,然后是一个或多个空格+一个或多个单词字符的零个或多个重复项,最后是字符串末尾的一个圆点(因此这是进行验证的地方)
  • (\w+)-组1:一个或多个单词字符.

要获得所需的结果,您需要获得组1的值.

Swift相关问答推荐

如何将趋势线添加到线性图中?

同步问题,发送Api Call之前未设置idToken

如何将EnvironmentObject从UIKit视图控制器传递到SwiftUI视图

SwiftUI - NavigationLink(value:)和navigationDestination不工作

了解SWIFT中的任务行为

是否可以循环遍历SWIFT子类并访问它们的静态变量S?

从Swift中的泛型类继承?

ClosedRange.Swift 中 Int 的索引?

NavigationStack 和 TabView - 工具栏和标题不显示

swiftui中服务端图片如何设计view并赋予rotationEffect?

Swift-SceneKit-无法从art.scnassets加载.scn文件

如何在 SWIFTUI 中旋转修剪?

在 Swift 中实现自定义异步序列

如何让 UIKit 挤压你的视图,使其适合屏幕

为什么 `map(foo)` 和 `map{ foo($0) }` 返回不同的结果?

使用自定义相机拍照 iOS 11.0 Swift 4. 更新错误

在 Xcode 中自动实现 Swift 协议方法

从 NSData 对象在 Swift 中创建一个数组

如何在 Swift 中将 UILabel 居中?

如何快速格式化用户显示(社交网络等)的时间间隔?