草庐IT

正则表达式匹配带标点符号但不单独标点符号的单词

coder 2023-09-06 原文

我需要匹配字符串中可能包含符号的单词,既可以是单词也可以是标点符号。一个示例字符串可以是:

This string's is a good example of situation I'll fail to match - due to punctuations being all over the place.

忽略那个句子的奇怪英语,我有一个案例,我需要匹配每个单词而不是标点符号,除非它是单词的一部分。所以我的结果应该是

  1. 这个
  2. 字符串(匹配 's 因为它是单词的一部分)
  3. 一个

...

  1. I'll(将 'll 与 I 匹配,因为它是单词的一部分)
  2. 失败
  3. 匹配
  4. 到期(跳过 -)

...

  1. place(没有句号,因为它不是单词的一部分。)

我想出了两个部分有效但都无法按我想要的方式工作的正则表达式

(?<=\\s|^)[A-Za-z0-9]+?(?=\\s|$) - I am using swift so `\\s` is for whitespace

这匹配普通单词但不匹配 string's 这样的大小写因为有一个 '在这个词中。但是,如果我使用其他表达方式:

(?<=\\s|^).+?(?=\\s|$)

匹配string's还有-句末句号如 place.

是否有一个表达式可以匹配带有标点符号但不单独使用标点符号的单词?我不介意是否需要多个表达式来捕获所有结果,我可以在显示之前合并结果。

注意:除了给出的例子,我知道的标点符号可以作为单词的一部分存在,也可以不包括 - ' () .而仅作为单词一部分的标点符号包括 % $ # & /可以假定任何其他标点符号永远不会成为任何单词的一部分。 ! ? " :预计会与单词有或没有空格出现,但不得匹配到结果中。

幸运的是,可以安全地假定该字符串仅包含字母数字和标点符号 - 其他语言字符和符号,如 <>{}[]|+*=可以假定不会出现在字符串中 - 还有一些其他符号适合我现在无法预测的四组符号之一,但我相信如果我能得到一个有效的逻辑,我可以调整它以包含更多符号每组。

最佳答案

您似乎需要一个正则表达式,它能够匹配前面或后面带有“单词”字符的选定符号,或者只是字母/数字或括号字母/数字。所有这些都应该在空格、字符串位置的开始/结束或单词边界内(注意这个顺序很重要)。

使用

(?<=\\s|^|\\b)(?:[-'.%$#&/]\\b|\\b[-'.%$#&/]|[A-Za-z0-9]|\\([A-Za-z0-9]+\\))+(?=\\s|$|\\b)

参见 regex demo .

详细信息:

  • (?<=\\s|^|\\b) - 正后视要求必须有空格,或字符串开头或当前位置左侧的单词边界
  • (?: - 非捕获组的开始,匹配 1+ 个序列:
    • [-'.%$#&/]\\b - 指定的符号后跟一个单词 char
    • | - 或者
    • \\b[-'.%$#&/] - 以单词 char 开头的指定符号
    • | - 或者
    • [A-Za-z0-9] - 一个字母数字
    • | - 或者
    • \\([A-Za-z0-9]+\\) - 一个 ( ,后跟 1+ 个字母数字符号,和一个 )
  • )+ - 非捕获组结束
  • (?=\\s|$|\\b) - 正向前瞻要求紧靠当前位置的右侧必须有空格、字符串结尾或单词边界。

要仅将点匹配为小数点分隔符,请添加额外的 \d*\.?\d+分支并取出.来自字符类:

(?<=\\s|^|\\b)(?:[-'%$#&/]\\b|\\b[-'%$#&/]|\\d*\\.?\\d+|[A-Za-z0-9]|\\([A-Za-z0-9]+\\))+(?=\\s|$|\\b)

参见 this regex demo

关于正则表达式匹配带标点符号但不单独标点符号的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42019240/

有关正则表达式匹配带标点符号但不单独标点符号的单词的更多相关文章

  1. ruby 正则表达式 - 如何替换字符串中匹配项的第 n 个实例 - 2

    在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg

  2. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

  3. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

    我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

  4. ruby - 正则表达式将非英文字母匹配为非单词字符 - 2

    @raw_array[i]=~/[\W]/非常简单的正则表达式。当我用一些非拉丁字母(具体来说是俄语)尝试时,条件是错误的。我能用它做什么? 最佳答案 @raw_array[i]=~/[\p{L}]/使用西里尔字符进行测试。引用:http://www.regular-expressions.info/unicode.html#prop 关于ruby-正则表达式将非英文字母匹配为非单词字符,我们在StackOverflow上找到一个类似的问题: https://

  5. Python 刷Leetcode题库,顺带学英语单词(31) - 2

    ValidPalindromeGivenastring,determineifitisapalindrome,consideringonlyalphanumericcharactersandignoringcases. [#125]Example:"Aman,aplan,acanal:Panama"isapalindrome."raceacar"isnotapalindrome.Haveyouconsiderthatthestringmightbeempty?Thisisagoodquestiontoaskduringaninterview.Forthepurposeofthisproblem

  6. ruby - 正则表达式在哪个位置失败? - 2

    我需要一个非常简单的字符串验证器来显示第一个符号与所需格式不对应的位置。我想使用正则表达式,但在这种情况下,我必须找到与表达式相对应的字符串停止的位置,但我找不到可以做到这一点的方法。(这一定是一种相当简单的方法……也许没有?)例如,如果我有正则表达式:/^Q+E+R+$/带字符串:"QQQQEEE2ER"期望的结果应该是7 最佳答案 一个想法:你可以做的是标记你的模式并用可选的嵌套捕获组编写它:^(Q+(E+(R+($)?)?)?)?然后你只需要计算你获得的捕获组的数量就可以知道正则表达式引擎在模式中停止的位置,你可以确定匹配结束

  7. ruby - 鸭子输入字符串、符号和数组的优雅方式? - 2

    这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby​​。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac

  8. ruby - 有没有办法从 ruby​​ case 语句中访问表达式? - 2

    我想从then子句中访问c​​ase语句表达式,即food="cheese"casefoodwhen"dip"then"carrotsticks"when"cheese"then"#{expr}crackers"else"mayo"end在这种情况下,expr是食物的当前值(value)。在这种情况下,我知道,我可以简单地访问变量food,但是在某些情况下,该值可能无法再访问(array.shift等)。除了将expr移出到局部变量然后访问它之外,是否有直接访问caseexpr值的方法?罗亚附注我知道这个具体示例很简单,只是一个示例场景。 最佳答案

  9. ruby - 正则表达式 - 排除一个字符 - 2

    这是一个例子:s="abcd+subtext@example.com"s.match(/+[^@]*/)Result=>"+subtext"问题是,我不想在其中包含“+”。我希望结果是“潜台词”,没有+ 最佳答案 您可以在正则表达式中使用括号来创建匹配组:s="abcd+subtext@example.com"s=~/\+([^@]*)/&&$1=>"subtext" 关于ruby-正则表达式-排除一个字符,我们在StackOverflow上找到一个类似的问题:

  10. ruby - 如果它是标点符号,我怎么能从字符串中删除最后一个字符,在 ruby​​ 中? - 2

    啊,正则表达式有点困惑。我正在尝试删除字符串末尾所有可能的标点符号:ifstr[str.length-1]=='?'||str[str.length-1]=='.'||str[str.length-1]=='!'orstr[str.length-1]==','||str[str.length-1]==';'str.chomp!end我相信有更好的方法来做到这一点。有什么指点吗? 最佳答案 str.sub!(/[?.!,;]?$/,'')[?.!,;]-字符类。匹配这5个字符中的任何一个(注意,。在字符类中并不特殊)?-前一个字符或组

随机推荐