我試圖找出一個正則運算式來匹配和替換Yo/yo或Йо/йо基于ЬО/ьо以下規則。
- 將
Yo/yo(大寫,非大寫字母)替換為Йо/йо如果它位于單詞的開頭或前面有字母:а,ъ,о,у,е,и。 - 如果不滿足上述條件,則替換
Yo/yo為ЬО/ьо。
我相信以下正則運算式會起作用,但有兩個問題:
- 我如何讓它為資本 (Yo/Йо/Ьо) 和非資本 (yo/йо/ьо) 作業?
- 如果不滿足條件
Йо/йо,我該如何替換ЬО/ьо?
(?<=а|ъ|о|у|е|и)йо
Regex.Replace(text, "(?<=а|ъ|о|у|е|и)йо", " "); // ??
測驗用例
[Theory]
[InlineData("Асансyoр", "Асансьор")]
[InlineData("Актyoр", "Актьор")]
[InlineData("Шофyoр", "Шофьор")]
[InlineData("Пощалyoн", "Пощальон")]
[InlineData("Trenyor", "Треньор")]
[InlineData("Булyoн", "Бульон")]
[InlineData("Бокyoр", "Бокьор")]
[InlineData("Сервитyoр", "Сервитьор")]
[InlineData("Раyoн", "Район")]
[InlineData("Маyoнеза", "Майонеза")]
[InlineData("Маyoр", "Майор")]
[InlineData("Yoрдан", "Йордан")]
[InlineData("Yoвка", "Йовка")]
public void ShouldReturnReplacedWord_WhenGivenWord(string word, string expected)
uj5u.com熱心網友回復:
這適用于 LinqPad 7 中的 xUnit:
#load "xunit"
void Main()
{
RunTests(); // Call RunTests() or press Alt Shift T to initiate testing.
}
static readonly Regex _yoRegex = new Regex( @"(?<pre>[\bayаъоуеи]?)(?<yo>[Yy]o)(?<post>\w )?", RegexOptions.Compiled );
static String ReplaceYo( String input )
{
if( _yoRegex.IsMatch( input ) )
{
String replaced = _yoRegex.Replace( input, YoMatchEvaluator );
return replaced;
}
else
{
throw new InvalidOperationException( "Input did not match regex." );
// return input;
}
}
static String YoMatchEvaluator( Match match )
{
String pre = match.Groups["pre" ].Value;
String yo = match.Groups["yo" ].Value;
String post = match.Groups["post"].Value;
Boolean isBeginningOfWord = ( pre.Length == 0 ) && ( match.Index == 0 );
Boolean isPrecededByVowel = ( pre.Length == 1 ); // Note that `\b` will mean `pre.Length == 0`.
Boolean isEndOfWord = ( post.Length == 0 );
if( isBeginningOfWord || isPrecededByVowel )
{
if( yo == "Yo" )
{
return pre "Йо" post;
}
else if( yo == "yo" )
{
return pre "йо" post;
}
else
{
throw new InvalidOperationException( "Unexpected \"Yo\" match: \"{0}\"".FmtInv( yo ) );
}
}
else
{
if( yo == "Yo" )
{
return pre "ЬО" post;
}
else if( yo == "yo" )
{
return pre "ьо" post;
}
else
{
throw new InvalidOperationException( "Unexpected \"Yo\" match: \"{0}\"".FmtInv( yo ) );
}
}
}
static class MyExtensions
{
public static String FmtInv( this String format, params Object?[]? args ) => String.Format( CultureInfo.InvariantCulture, format, args: args );
}
#region private::Tests
[Theory]
[InlineData( 1, "Асансyoр", "Асансьор")]
[InlineData( 2, "Актyoр", "Актьор")]
[InlineData( 3, "Шофyoр", "Шофьор")]
[InlineData( 4, "Пощалyoн", "Пощальон")]
//[InlineData( 5, "Trenyor", "Треньор")]
[InlineData( 5, "Trenyor", "Trenьоr")]
[InlineData( 6, "Булyoн", "Бульон")]
[InlineData( 7, "Бокyoр", "Бокьор")]
[InlineData( 8, "Сервитyoр", "Сервитьор")]
[InlineData( 9, "Раyoн", "Район")]
[InlineData( 10, "Маyoнеза", "Майонеза")]
[InlineData( 11, "Маyoр", "Майор")]
[InlineData( 12, "Yoрдан", "Йордан")]
[InlineData( 13, "Yoвка", "Йовка")]
[InlineData( 14, "Светлyo", "Светльо")]
public void ShouldReturnReplacedWord_WhenGivenWord( Int32 testCase, String word, String expected)
{
String actual = ReplaceYo( word );
Assert.Equal( expected: expected, actual: actual );
}
#endregion
試驗結果:
| 輸入 | 預期的 | 實際的 | 結果 |
|---|---|---|---|
"Асансyoр" |
"Асансьор" |
"Асансьор" |
經過 |
"Актyoр" |
"Актьор" |
"Актьор" |
經過 |
"Шофyoр" |
"Шофьор" |
"Шофьор" |
經過 |
"Пощалyoн" |
"Пощальон" |
"Пощальон" |
經過 |
"Trenyor" |
"Trenьоr" |
"Trenьоr" |
經過 |
"Булyoн" |
"Бульон" |
"Бульон" |
經過 |
"Бокyoр" |
"Бокьор" |
"Бокьор" |
經過 |
"Сервитyoр" |
"Сервитьор" |
"Сервитьор" |
經過 |
"Раyoн" |
"Район" |
"Район" |
經過 |
"Маyoнеза" |
"Майонеза" |
"Майонеза" |
經過 |
"Маyoр" |
"Майор" |
"Майор" |
經過 |
"Yoрдан" |
"Йордан" |
"Йордан" |
經過 |
"Yoвка" |
"Йовка" |
"Йовка" |
經過 |
"Светлyo" |
"Светльо" |
"Светльо" |
經過 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/513895.html
標籤:C#。网正则表达式
