【问题标题】:Regular expression for matching either or匹配或匹配的正则表达式
【发布时间】:2014-01-07 07:05:22
【问题描述】:

我在记事本++中这样做

这是我的数据的样子

N|12345|JOHN|TAKÁCSI|blah|blah|
N|12466|PÉTER|VÁLI|blah|blah|
Y|45645|SÁNDAR|SÁKU|blah|blah|
N|89789|DÓRA|MERRY|blah|blah|


My regular expression: ^([N|Y]\|.*\|.*[^\x00-\x7F].*\|.*[^\x00-\x7F].*\|)

仅匹配名字和姓氏中都包含该 UTF 字符的行。
如果任一名称具有该字符,则不显示。

如何获得?

【问题讨论】:

  • 只要 grep 获取[^\x00-\x7f] 就行了?
  • 顺便说一句,[N|Y] 匹配括号之间的三个字符中的任何一个。我猜你不希望| 在里面。

标签: regex notepad++ utf


【解决方案1】:

^[NY]\|\d{5}\|(?:[\w_]+[^\x00-\x7F]?[\w_]+\|){2}(?:[\w_]+[\x00-\x7F]?[\w_]+\|){2}$

匹配:

N|12345|JOHN|TAKÁCSI|blah|blah|
N|12466|PÉTER|VÁLI|blah|blah|
Y|45645|SÁNDAR|SÁKU|blah|blah|
N|89789|DÓRA|MERRY|blah|blah|

不匹配:

N|89789|DÓRA|MERRY|blah|blÓh|
N|89789|DoRA|MERRY|blaÓh|blah|
N|89789|DoRA|MERRY|blaÓh|blÓah|

您正在检查两者是否具有 UTF 字符,我将其更改为只需要匹配一个,另一个现在不是强制性的。我还使用了下面@HamZa 的部分答案来修改此答案以适合您的数据集和需求。

【讨论】:

  • 即使 |blah|blah| 中存在 UTF,上面的正则表达式也是匹配的我不想要。如果 UTF 仅在名字或姓氏中,那么我想要该行。如果 UTF 在 |blah|blah|我不想要那条线。
【解决方案2】:

你可以使用:^[NY]\|\d+(?:\|[^\W_]+){4}\|$

说明:

  • ^ : 匹配行首
  • [NY] :匹配 NY。您应该使用[N|Y],因为这也会使其匹配管道|
  • \| :匹配管道 |
  • \d+ :匹配一位或多位数字
  • (?: : 非捕获组
    • \| :匹配管道 |
    • [^\W_]+ :我们可以使用 \w 来匹配字母数字字符,但 _ 也将被包括在内。因此,为了不匹配 _,我们只需将其反转即可。
  • ){4} :组结束,重复4次。
  • \| :匹配管道 |
  • $ : 匹配行尾

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多