正则表达式匹配大于长度的字符串,但不包括结尾的匹配

时间:2018-08-03 14:40:21

标签: regex regex-lookarounds

正如标题所述,我正在寻找一个匹配大于给定长度的字符串的正则表达式,所以:

[\s\S]{51,}

因此符合以下条件:

Cras risus ipsum, faucibus ut, ullamcorper id, varius ac, leo.

以下内容不会:

Vestibulum volutpat pretium libero.

但是,我想要一个附加条件,即应该从字符计数中排除出现在字符串末尾的特定字符序列。该序列本身可以由正则表达式定义。例如:

something\/[\w]+\/at-the-end\/[\d]+$

因此以下内容仍应匹配:

Cras risus ipsum, faucibus ut, ullamcorper id, varius ac, leo.

并且以下内容仍不应:

Vestibulum volutpat pretium libero. something/random/at-the-end/12345

我在想,如果可能的话,它会以某种方式涉及环顾四周,但是我不知道如何去构建它。我正在寻找使用单个正则表达式的解决方案。

2 个答案:

答案 0 :(得分:1)

您可以尝试使用负前瞻来调整模式匹配:

^((?!at-the-end\/\d+)[\s\S]){51,}[\s\S]*$

Demo

该模式背后的基本思想是,只要随后出现的是 not at-the-end/,然后使用一个或多个数字,然后使用字符串。

答案 1 :(得分:1)

不太漂亮,但是此regex甚至可以在javascript中使用:

(?(DEFINE)(?<random>something\/[\w]+\/at-the-end\/[\d]+$))^(.{51,}(?P>random))|((?!.*(?P>random)).{51,})$

它将查找以随机内容结尾的行,该行至少应包含51个字符。
或者,它查找至少51个字符,但结尾处没有随机字符。

您可以here对其进行测试

使用PCRE正则表达式引擎,您可以为该随机填充使用预定义的模式。

Sub Copy_S3ToS1()
    '
    ' Select everything from Sheet3 and copy to Sheet1
    '
    Sheets("Sheet3").Select
    ActiveSheet.UsedRange.Copy
    Application.Wait (Now + TimeValue("0:00:03"))

    Sheets("Sheet1").Select
    ActiveCell.SpecialCells(xlLastCell).Select
    Cells(ActiveCell.Row, "A").Activate
    SendKeys "{down}"
    ActiveSheet.Paste
End Sub