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 次
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