Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何将文本与忽略标点和换行符的正则表达式匹配_Ios_Regex - Fatal编程技术网

Ios 如何将文本与忽略标点和换行符的正则表达式匹配

Ios 如何将文本与忽略标点和换行符的正则表达式匹配,ios,regex,Ios,Regex,我有一个应用程序,我需要找到一段文字中单词列表的位置。正则表达式显然是实现这一点的方法,但我面临的问题是,我可能在单词之间有各种标点符号或新行。我如何“找到这些单词可能是分开的,但一些非字母数字字符” 更新: 例如,我需要找到以下范围: 这些正则表达式太可怕了 在 开发人员喊“救命”,这些正则表达式太可怕了! 所以,请帮助我:( 描述 \b(?[a-z](?:[a-z\n\r:;,?!-]*[a-z])?)\b **点击查看更大的图片 此正则表达式将执行以下操作: 要求所有单词以a-z开头

我有一个应用程序,我需要找到一段文字中单词列表的位置。正则表达式显然是实现这一点的方法,但我面临的问题是,我可能在单词之间有各种标点符号或新行。我如何“找到这些单词可能是分开的,但一些非字母数字字符”

更新:

例如,我需要找到以下范围:

这些正则表达式太可怕了

开发人员喊“救命”,这些正则表达式太可怕了! 所以,请帮助我:(

描述
\b(?[a-z](?:[a-z\n\r:;,?!-]*[a-z])?)\b

**点击查看更大的图片

此正则表达式将执行以下操作:

  • 要求所有单词以
    a-z
    开头和结尾,或为单个字母长度
  • 允许单词包含新行字符或常用标点符号,如
    :;,?!-
  • 单词不允许包含空格
例子 现场演示

示例文本

如何将文本与常规表达式匹配
是否忽略标点符号和换行符?
“我该怎么做”找到这些词-
同胞分隔,但有一些非字母数字字符“?
样本匹配

匹配1
0.[0-3]`怎么做`
比赛2
0.[4-6]`做什么`
比赛3
0.[7-8]`我`
第四场
0.[9-14]`匹配`
第五场
0.[15-19]`文本`
第六场
0.[20-24]`与`
第七场
0.[25-26]`a`
第八场
0.[27-34]`常规`
第九场
0.[35-46]`expres
锡安`
第十场
0.[47-55]`忽略`
比赛11
0.[56-67]`标点符号`
第12场
0.[68-71]`和`
比赛13
0.[72-76]`行`
第14场
0.[77-88]`休息?
怎么`
第15场
0.[89-91]`做什么`
第16场
0.[92-93]`我`
第17场
0.[94-96]`做什么`
第18场
0.[98-102]`查找`
第19场
0.[103-108]`这些`
第20场
0.[109-114]`字`
第21场
0.[115-125]`位置-
兄弟姐妹`
第22场
0.[126-135]`分开`
比赛23
0.[136-139]`但是`
第24场
0.[140-144]`有些`
第25场
0.[145-161]`非字母数字`
第26场
0.[162-172]`个字符`
解释
节点说明
----------------------------------------------------------------------
\b单词char(\w)和
不是单词char的东西
----------------------------------------------------------------------
(?:组,但不捕获:
----------------------------------------------------------------------
[a-z]任意字符:“a”到“z”
----------------------------------------------------------------------
(?:组,但不捕获(可选)
(匹配尽可能多的金额):
----------------------------------------------------------------------
[a-z\n\r.:;,?!-任何'a'到'z'的字符,'\n'
]*(换行符),“\r”(回车符),
'.', ':', ';', ',', '?', '!', '-' (0
或更多次(匹配最多
(可能的金额)
----------------------------------------------------------------------
[a-z]任意字符:“a”到“z”
----------------------------------------------------------------------
)?分组结束
----------------------------------------------------------------------
)分组结束
----------------------------------------------------------------------
\b单词char(\w)和
不是单词char的东西
----------------------------------------------------------------------

额外学分

如果你还想消除上面的匹配,如你有一个<代码> >代码>后面跟着一个新的行字符。在这个配置中,<代码> >代码>不应该被认为是单词的一部分,在这里,作为<代码> ->代码>后面的一个新行实际上是连字符。然后你应该考虑这个

\b(?:[a-z](?:(?:[a-z-]+|[.:;,?!-]+(?![\n\r])|[\n\r]+)*[a-z])?)\b

现场演示:

我想出来了:

let pattern = String(format: "(\\b%@\\b)",words.joinWithSeparator("[^a-zA-Z\\d\\s:]?[ ]"))

“\b”给出单词边界,然后它匹配分隔的单词,但有一个可选的标点符号,然后是一个空格。我可能需要为双标点符号添加一些位,但现在它可以工作了。

你能给我们一个文本示例吗?写得很好,但它只匹配所有单词。我需要做的是找到s的范围可以通过匹配“我确实找到了这些”(忽略“)“来“我确实找到了这些”。这有意义吗?我看到您正在更新,但不清楚为什么要跳过前两个词或后三个词。因为这是我必须做的:查找一个词序列是否在文本块中的某个位置,如果是,则在何处。