查看: 453|回复: 13
打印 上一主题 下一主题

[求助] 正则如何匹配汉字?

[复制链接]
  • TA的每日心情
    擦汗
    2020-7-3 13:51
  • 签到天数: 19 天

    [LV.4]偶尔看看III

    90

    主题

    277

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    10032
    跳转到指定楼层
    1
    发表于 2021-2-18 21:47:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    最近OCR了一个词组词典,获得一个全书索引,每行如下:

    add up加起来;说得通

    左边是词组,右边是中文释义,现在想将中文释义换行从头输出,所以需要匹配第一个汉字前面加\r\n换行符号。

    网上查了匹配中文字符的正则表达式: [u4e00-u9fa5]
    但在NOTEPAD ++ 和 EMEDITOR里试了都么有用,它们都是中文字符英文字母一块匹配上了。

    有高手指点一下?谢谢!
  • TA的每日心情
    开心
    2019-8-21 19:27
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    61

    主题

    627

    回帖

    16万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    162733

    QQ 章灌水大神章笑傲江湖章

    推荐
    发表于 2021-2-18 22:36:52 | 只看该作者
    本帖最后由 Mandolin 于 2021-2-18 22:39 编辑

    EmEditor 里查找:
    1. ([a-z])( *)([\x{4e00}-\x{9fa5}])
    复制代码

    替换为:
    1. \1\n\3
    复制代码

    评分

    1

    查看全部评分

  • TA的每日心情
    开心
    2019-8-21 08:44
  • 签到天数: 163 天

    [LV.7]常住居民III

    17

    主题

    393

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    14980
    3
    发表于 2021-2-18 23:35:48 | 只看该作者
    本帖最后由 mikeee 于 2021-2-18 23:39 编辑

    notepad++里

    1. ([^一-龥]+)([一-龥].*)
    复制代码

    替代
    1. \1\n\2
    复制代码


    [一-龙](对应[\u4e00-\u9f99])或[一-龟](对应[\u4e00-\u9f9f])或[一-龥](对应[\u4e00-\u9fa5])都可以,\u9f9a-\u9fa5(除了龟\u9f9f)都是些不常用字。

    评分

    1

    查看全部评分

  • TA的每日心情
    擦汗
    2020-7-3 13:51
  • 签到天数: 19 天

    [LV.4]偶尔看看III

    90

    主题

    277

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    10032
    4
     楼主| 发表于 2021-2-18 23:49:34 | 只看该作者
    Mandolin 发表于 2021-2-18 22:36
    EmEditor 里查找:

    替换为:

    有用!感谢大师!
  • TA的每日心情
    无聊
    2022-9-25 21:09
  • 签到天数: 1136 天

    [LV.10]以坛为家III

    17

    主题

    3142

    回帖

    2万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    25289

    灌水大神章

    5
    发表于 2021-2-19 20:08:28 | 只看该作者
    请问有没有日文五十音+日文汉字的?
  • TA的每日心情
    开心
    2019-11-30 08:00
  • 签到天数: 56 天

    [LV.5]常住居民I

    4

    主题

    412

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    11150

    灌水大神章

    6
    发表于 2021-2-21 19:50:30 | 只看该作者
    Mandolin 发表于 2021-2-18 22:36
    EmEditor 里查找:

    替换为:

    借楼请教一个问题:EmEditor里如何匹配包含换行符的任意字符?
    用“.*?”,然后勾选了“高级”选项卡的“正则表达式“.”可匹配换行符”也没用。
  • TA的每日心情
    开心
    2019-8-21 19:27
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    61

    主题

    627

    回帖

    16万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    162733

    QQ 章灌水大神章笑傲江湖章

    7
    发表于 2021-2-22 07:19:18 | 只看该作者
    “.”不包括换行的,匹配换行:
    1. .+\n.+
    复制代码


    评分

    1

    查看全部评分

  • TA的每日心情
    擦汗
    2020-7-3 13:51
  • 签到天数: 19 天

    [LV.4]偶尔看看III

    90

    主题

    277

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    10032
    8
     楼主| 发表于 2021-2-22 16:29:00 | 只看该作者
    本帖最后由 starmars 于 2021-2-22 16:30 编辑
    wnsfzf 发表于 2021-2-21 19:50
    借楼请教一个问题:EmEditor里如何匹配包含换行符的任意字符?
    用“.*?”,然后勾选了“高级”选项卡的 ...


    匹配包括回车换行符和空字符在内的任意字符有三种方法:
    [\s\S]*
    [\d\D]*
    [\w\W]*

    评分

    1

    查看全部评分

  • TA的每日心情
    开心
    2019-11-30 08:00
  • 签到天数: 56 天

    [LV.5]常住居民I

    4

    主题

    412

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    11150

    灌水大神章

    9
    发表于 2021-2-22 16:32:20 | 只看该作者
    Mandolin 发表于 2021-2-22 07:19
    “.”不包括换行的,匹配换行:

    非常感谢!那如果包含1 个以上换行符咋办呢?
  • TA的每日心情
    开心
    2019-11-30 08:00
  • 签到天数: 56 天

    [LV.5]常住居民I

    4

    主题

    412

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    11150

    灌水大神章

    10
    发表于 2021-2-22 16:55:12 | 只看该作者
    starmars 发表于 2021-2-22 16:29
    匹配包括回车换行符和空字符在内的任意字符有三种方法:
    [\s\S]*
    [\d\D]*

    这个也试过了,在EmEditor中没有包含换行。
  • TA的每日心情
    擦汗
    2020-7-3 13:51
  • 签到天数: 19 天

    [LV.4]偶尔看看III

    90

    主题

    277

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    10032
    11
     楼主| 发表于 2021-2-22 22:29:09 | 只看该作者
    wnsfzf 发表于 2021-2-22 16:55
    这个也试过了,在EmEditor中没有包含换行。

    正则表达式只是一种规范,真正实现它可以有各种版本, 而这些版本可能有细微的差别。

    就象每种编程语言的正则表达式的API类库对正则表达式的解读不100%相同一样,编辑器也有细微区别。比如,我刚刚发现NOTEPAD++在分组定义上是没有默认用\0分组表示字符串本身的,你必须加括号将原字符串括起来然后用\1分组来引用;而EmEditor则遵从标准的\0约定。

    [\s\S],[\d\D],[\w\W] 可表示任何字符这是最标准的写法,但也许EmEditor就不认为它们可以表示回车换行,或者干脆它可能就是该编辑器的一个BUG也有可能。

    我比较熟悉C#,它的正则API库很多函数可以指定一个参数RegexOptions 枚举作为选项来细化正则处理的要求,见:
    https://docs.microsoft.com/zh-cn ... ptions?view=net-5.0

    虽然大家不一定会C#,但是这个网页上的信息很有价值,不同语言正则库和编辑器在正则表达式实现上的区别,往往就体现在这些细节上。有时这些林林总总的具体实现并不象C#这样给你选择,而是固化了某种实现细节而不容程序员设置更改,你除了观察它的规律适应它别无选择。
  • TA的每日心情
    开心
    2019-8-21 08:44
  • 签到天数: 163 天

    [LV.7]常住居民III

    17

    主题

    393

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    14980
    12
    发表于 2021-2-22 22:59:40 | 只看该作者
    本帖最后由 mikeee 于 2021-2-22 23:02 编辑

    其实还有一个匹配换行符的方法

    1. (?s).
    复制代码

    所谓的single line选项。和notepad++的选项 ". matches newline" 一个意思。

    例如
    1. (?s).+
    复制代码

    匹配全部行

    notepad++支持,不过emeditor不支持,emeditor的正则貌似不太规则,编辑大文件很不错,可能只有vim可以抗衡,vim用的正则貌似更不规则
  • TA的每日心情
    开心
    2019-11-30 08:00
  • 签到天数: 56 天

    [LV.5]常住居民I

    4

    主题

    412

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    11150

    灌水大神章

    13
    发表于 2021-2-23 09:03:40 | 只看该作者
    starmars 发表于 2021-2-22 22:29
    正则表达式只是一种规范,真正实现它可以有各种版本, 而这些版本可能有细微的差别。

    就象每种编程语言的 ...

    看来这是一个很专业的问题,我只是平时办公偶尔用到,就不再深入了,感谢你的耐心解答,感谢!
  • TA的每日心情
    开心
    2019-11-30 08:00
  • 签到天数: 56 天

    [LV.5]常住居民I

    4

    主题

    412

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    11150

    灌水大神章

    14
    发表于 2021-2-23 09:08:11 | 只看该作者
    mikeee 发表于 2021-2-22 22:59
    其实还有一个匹配换行符的方法

    是的,emeditor打开大文件速度很快,但就是正则不太会用,感谢!