add: 在用户输入中提取参数

This commit is contained in:
jackfiled 2023-10-23 22:38:13 +08:00
parent 2fd587fc6e
commit 52ede9fe96
5 changed files with 133 additions and 5 deletions

View File

@ -0,0 +1,37 @@
using System.Text.RegularExpressions;
using Katheryne.Models;
namespace Katheryne.Tests;
public class StringFormatterTests
{
[Fact]
public void FormatTest1()
{
StringFormatter formatter = new("Hello $1");
Regex regex = new("I'm (.*)");
Match match = regex.Match("I'm jackfiled");
Assert.True(match.Success);
Assert.True(formatter.IsFormat);
Assert.Equal("Hello jackfiled", formatter.Format(match.Groups));
}
[Fact]
public void FormatTest2()
{
StringFormatter formatter = new("$你好呀 $1, 欢迎你离开垃圾的$2.");
Regex regex = new("你好,我是(.*),我来自(.*)\\.");
Match match = regex.Match("你好我是Ichirinko我来自Trinity.");
Assert.True(match.Success);
Assert.True(formatter.IsFormat);
Assert.Equal("$你好呀 Ichirinko, 欢迎你离开垃圾的Trinity.", formatter.Format(match.Groups));
}
}

View File

@ -27,7 +27,7 @@ public class KatheryneChatRobot : IChatRobot
{
return new[]
{
_grammarTree[_currentStage].Answer
_grammarTree[_currentStage].Answer.RowString
};
}
@ -55,7 +55,17 @@ public class KatheryneChatRobot : IChatRobot
if (match.Success)
{
_currentStage = transformer.NextStage;
result.Add(_grammarTree[_currentStage].Answer);
StringFormatter answer = _grammarTree[_currentStage].Answer;
if (answer.IsFormat)
{
string temp = answer.Format(match.Groups);
_logger.LogInformation("Format answer {} to {}.", answer.RowString, temp);
result.Add(temp);
}
else
{
result.Add(answer.RowString);
}
_logger.LogInformation("Moving to stage {} on input {}.", _currentStage, input);
break;
}
@ -81,7 +91,7 @@ public class KatheryneChatRobot : IChatRobot
{
flag = true;
_currentStage = transformer.NextStage;
result.Add(_grammarTree[_currentStage].Answer);
result.Add(_grammarTree[_currentStage].Answer.RowString);
_logger.LogInformation("Moving to stage {} with empty transform.", _currentStage);
break;

View File

@ -0,0 +1,3 @@
namespace Katheryne.Models;
public record FormatTag(string Value, int Index);

View File

@ -6,12 +6,12 @@ internal class InnerStage
public List<InnerTransformer> Transformers { get; } = new();
public string Answer { get; }
public StringFormatter Answer { get; }
public InnerStage(Stage stage)
{
Name = stage.Name;
Answer = stage.Answer;
Answer = new StringFormatter(stage.Answer);
foreach (Transformer transformer in stage.Transformers)
{

View File

@ -0,0 +1,78 @@
using System.Text.RegularExpressions;
namespace Katheryne.Models;
/// <summary>
/// 格式化字符串模型类
/// </summary>
public class StringFormatter
{
private readonly string _originString;
private readonly List<FormatTag> _formatTags = new();
public StringFormatter(string originString)
{
_originString = originString;
GetFormatTags();
}
public bool IsFormat => _formatTags.Count != 0;
public string RowString => _originString;
public string Format(GroupCollection collection)
{
var result = new string(_originString);
foreach (FormatTag tag in _formatTags)
{
if (tag.Index > collection.Count)
{
continue;
}
result = result.Replace(tag.Value, collection[tag.Index].Value);
}
return result;
}
private void GetFormatTags()
{
List<int> indexes = new();
for (var i = 0; i < _originString.Length; i++)
{
if (_originString[i] == '$')
{
indexes.Add(i);
}
}
foreach (int index in indexes)
{
string value = string.Empty;
int pos = index + 1;
// 如果 $ 之后的字符不是数字就忽略处理
if (_originString[pos] < '0' || _originString[pos] > '9')
{
continue;
}
while (_originString[pos] >= '0' && _originString[pos] <= '9')
{
value = value + _originString[pos];
pos++;
if (pos >= _originString.Length)
{
break;
}
}
_formatTags.Add(new FormatTag('$' + value, int.Parse(value)));
}
}
}