4 个版本 (2 个破坏性更新)

0.3.0 2024年5月15日
0.2.1 2024年2月1日
0.2.0 2024年2月1日
0.1.0 2024年2月1日

#102国际化和本地化 (i18n)

每月下载 28

MIT 许可证

44KB
656 代码行

korean-regex

韩文由辅音、元音、韵尾组合而成,因此有时分别分析或使用它们是有用的。

korean-regex 允许您将韩文组合为辅音、元音、韵尾。

更详细的说明请参阅 文档

use korean_regex::*;

let order = Order::Default;
// 마지막 음절이 받침이 없는 모든 음절 캡쳐
let pattern = compile(r"[::]*[:]\b", &order).unwrap();
let result: Vec<_> = pattern
    .captures_iter("한글은 초성, 중성, 종성의 조합이기에 각각을 분리해 분석하거나 사용하는 것이 때때로 유용합니다.")
    .map(|captures| captures[0].to_string())
    .collect();
assert_eq!(vec!["종성의", "조합이기에", "분리해", "분석하거나", "것이", "때때로", "유용합니다"], result)

lib.rs:

korean-regex

韩文由辅音、元音、韵尾组合而成,因此有时分别分析或使用它们是有用的。

korean-regex 允许您将韩文组合为辅音、元音、韵尾。

语法

基本上,korean-regex 是单字符 OR 语法的一个扩展。它不会改变正则表达式的其他语法。

首先,辅音、元音、韵尾分别用 [] 包围并用 : 分隔。例如,以下示例中的 [::],则辅音是 ,元音是 ,韵尾是 ,结果是

use korean_regex::*;

let order = Order::Default;
assert_eq!("[각]", compile("[ㄱ:ㅏ:ㄱ]", order).unwrap().to_string());

在一部分中写入两个以上的字符时,将其转换为所有可能的组合。例如,以下示例中的 [ㄱㄴ:ㅏㅣ:] 将转换为所有可能的组合,如 간긴난닌

use korean_regex::*;

let order = Order::Default;
assert_eq!("[간긴난닌]", compile("[ㄱㄴ:ㅏㅣ:ㄴ]", order).unwrap().to_string());

如果该空位为空,则表示该位置可以接受任何内容。例如,[::] 表示 '所有以 结尾的音节'。

use korean_regex::*;

let order = Order::Default;
assert_eq!("[갛갷걓걯...흏흫힇힣]", compile("[::ㅎ]", order).unwrap().to_string());

通过 - 可以替换连续的音节。

请注意,在这种情况下,默认情况下 ㄱㄴㄷㄹ... 并不是 而是 ㄱㄲㄴㄷㄸㄹ... 这样的字典顺序匹配。这同样适用于元音和韵尾。

use korean_regex::*;

let order = Order::Default;
assert_eq!("[간깐난단딴란]", compile("[ㄱ-ㄹ:ㅏ:ㄴ]", order).unwrap().to_string());
assert_eq!("[간갠갼걘건겐견곈곤관괜괸굔군권궨귄균근긘긴]", compile("[ㄱ:ㅏ-ㅣ:ㄴ]", order).unwrap().to_string());
assert_eq!("[간-갈]", compile("[ㄱ:ㅏ:ㄴ-ㄹ]", order).unwrap().to_string());

0 表示该位置没有音节。默认情况下用于韵尾。

use korean_regex::*;

let order = Order::Default;
assert_eq!("[가각간나낙난다닥단]", compile("[ㄱㄴㄷ:ㅏ:0ㄱㄴ]", order).unwrap().to_string());

但是,可以使用特殊的 [*:0:0][0:*:0] 形式。

use korean_regex::*;

let order = Order::Default;
assert_eq!("[ㄱㄲㄴㄷㄸㄹ]", compile("[ㄱ-ㄹ:0:0]", order).unwrap().to_string());
assert_eq!("[ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ]", compile("[0:ㅏ-ㅣ:0]", order).unwrap().to_string());

使用 ^ 可以指定匹配某个音素时想要替换的字符。例如,如果声母是 ,韵母是 ,而韵尾不是 ,那么所有的音素可以用 [::^] 来表示。

use korean_regex::*;

let order = Order::Default;
assert_eq!("[가-갇갉-갛]", compile("[ㄱ:ㅏ:^ㄹ]", order).unwrap().to_string());

如果想要匹配没有韵尾的字符,可以用 [*:*:0] 语法,而不是 [*:*:0]。例如,[ㄱㄴㄷ:ㅏㅣ:0] 可以替换为 [ㄱㄴㄷ:ㅏㅣ]

use korean_regex::*;

let order = Order::Default;
assert_eq!("[가기나니다디]", compile("[ㄱㄴㄷ:ㅏㅣ:0]", order).unwrap().to_string());
assert_eq!("[가기나니다디]", compile("[ㄱㄴㄷ:ㅏㅣ]", order).unwrap().to_string());

如果想要在匹配中添加几个独立的字符,只需在后面添加 | 即可。

use korean_regex::*;

let order = Order::Default;
assert_eq!("[과구놔누돠두한abc]", compile("[ㄱㄴㄷ:ㅜㅘ|한abc]", order).unwrap().to_string());

韩文有一些是由两个或更多字符组合而成的字符。例如, 等。如果输入法不支持像 这样的字符,或者出于美观原因想在代码中避免它们,可以使用括号来组合字符。

use korean_regex::*;

let order = Order::Default;
assert_eq!("[곿괇궧궯뽟뽧쀇쀏]", compile("[ㄱ(ㅂㅂ):(ㅗㅏ)(ㅜㅔ):(ㄹㅂ)(ㄱㅅ)]", order).unwrap().to_string());

如果这个独特语法的作用范围超出了限制,就可以像基本正则表达式一样混合使用。

use korean_regex::*;

let order = Order::Default;
let pattern = compile(r"\b([아-잏][^ ]{0,2})\b", order).unwrap();
let input = "저기 양을 잡아먹는 이리 때가 오르막길을 타고 간다!";
let result: Vec<_> = pattern.find_iter(input).map(|m| m.as_str()).collect();
assert_eq!(vec!["양을", "이리"], result);

示例

与其他语法结合时,可以使用以下方式。

use korean_regex::*;

let order = Order::Default;
// 초성이 ㄱ이 아니고 그 뒤에 종성이 `ㅇ`인 모든 글자가 오며 그 다음 글자 바운더리 혹은 종성이 없는 문자가 있는 경우
let pattern = compile(r"[^ㄱ::][::ㅇ](\b|[:])", order).unwrap();
let result: Vec<_> = pattern
    .captures_iter("한글은 초성, 중성, 종성의 조합이기에 각각을 분리해 분석하거나 사용하는 것이 때때로 유용합니다.")
    .map(|captures| captures[0].to_string())
    .collect();
assert_eq!(vec!["초성", "중성", "종성의", "사용하"], result)

连字符替换

正则表达式的 [] 语法中有用 - 来替换连续字符的语法。

如果连续字符有三个或更多,korean-regex 也可以使用 - 语法。

use korean_regex::*;

let order = Order::Default;
assert_eq!("[가-깋라-맇]", compile("[ㄱㄹ::]", order).unwrap().to_string());

依赖关系

~2.2–3MB
~53K SLoC