ios - 正则表达式不允许在字符串 swift ios 中盯着空格
问题描述
我想创建允许字符数字和空格的正则表达式,但不是在字符串的开头,我已经创建了一个但它不起作用"^\\S.*[^A-Za-z0-9_ ].*"
。
迅速:
func containsAllowedCharacters(regex: String?, stringToCheck: String) -> Bool {
var isValid = false
if let regex = regex {
let testString = NSPredicate(format: "SELF MATCHES %@", regex)
isValid = testString.evaluate(with: stringToCheck)
}
return !isValid
}
解决方案
您的模式 ,^\S.*[^A-Za-z0-9_ ].*
与字符串开头匹配^
,然后与任何非空白字符\S
匹配(注意它匹配任何标点符号、字母和数字),然后匹配除换行符以外的任何零个或多个字符,与.*
, 然后匹配除 ASCII 字母、数字_
或空格之外的任何字符,然后再次匹配除换行符以外的任何零个或多个字符,与.*
.
如您所见,所有模式部分的匹配程度超出了您的允许范围。另外,请注意,您实际上需要至少两个字符与此模式一起出现,而您的代码暗示您也需要支持零长度字符串。
您可以使用
let FileNameRegex = #"^(?!\s)[A-Za-z0-9_\s]*$"#
注意:当您在 中使用它时MATCHES
,NSPredicate.evaluate
您不需要两端的^
and锚点,因为需要完整的字符串匹配:$
MATCHES
let FileNameRegex = #"(?!\s)[A-Za-z0-9_\s]*"#
let testString = NSPredicate(format: "SELF MATCHES %@", regex)
请注意#"..."#
生成原始字符串文字的符号的使用,其中单个反斜杠被解析为文字反斜杠。
模式匹配
^
- 字符串的开始(?!\s)
- 与字符串中未紧跟空格的位置匹配的负前瞻[A-Za-z0-9_\s]*
-零个或多个(由于*
量词)ASCII 字母、数字、下划线和空格$
- 字符串结束。
推荐阅读
- perl - Perl 将文件内容直接读取到内存中,我说得对吗?
- python - 创建 Numpy 结构化数组
- flask - 从 18.04 升级到 ubuntu 20.04 后 Flask apache2 wsgi 错误
- javascript - 如何恢复 JS-Search 结果?
- github - 将 Github 松弛集成限制为仅分配给我或参与的评论
- flutter - Flutter Image Cropper Android Manifest Error - “com.yalantis.ucrop.UCropActivity,在项目或库中找不到”
- javascript - window.open 被 popupblocker 阻止
- firebase - Firestore 规则的 Firebase 身份验证传播时间?
- abap - ABAP中的数字到字符串转换函数
- android - NFC 在活动的 KIOSK 模式下无法正常工作