解决 超越我的理解的正则表达式失败

颂歌

众所周知的成员
加入
2020年12月11日
消息
122
编程经验
Beginner
我正在尝试匹配一个单词并用大写版本替换,我不明白为什么没有看到这个词?

我用过:

C#:
@"\bor\b", "OR"

我添加到字典为键和值,正则表达式是密钥。

我的理解,我的阅读似乎是建议的,这将通过寻找非单词字符的字符串搜索,然后是'o',然后是'r',然后在它匹配后找到一个非单词字符那两个,它会考虑完整匹配。

我要检查键是否存在于字符串中的键,以免避免异常错误:

C#:
foreach (KeyValuePair<string, string> entry in dict)
                    {
                        if (item.Contains(entry.Key))
                        {
                            var outPut2 = Regex.Replace(item, string.Join("|", dict.Keys.Select(k => k.ToString()).ToArray()), m => dict[m.Value]);
                            strOut.Text += outPut2 + Environment.NewLine;
                        }
                    }

项目是短语:"ConsKa or Conske"

keyvaluepair不匹配@"\bor\b"只是跳过它。

我真的不明白为什么它不匹配?

字典和LINQ没有问题,因为那些我不必使用正则表达式的术语(从不显示在单词中间的字符)并替换为没有问题。正是当我来处理可能出现在一个单词中间的角色时,我想依赖这个问题的正则表达式。
 
Solution
如果正则表达式不依赖于行边界,则可以执行此操作以替换文本中的所有匹配表达式:
C#:
var input = InputTextbox.Text;
foreach (var entry in dict)
    input = Regex.Replace(input, entry.Key, entry.Value);
OutputTextbox.Text = input;

约翰

C#论坛主持人
工作人员
加入
2011年4月23日
消息
1,154
地点
挪威
编程经验
10+
它只是一个数组,因为你将字符串拆分为数组。
strinput.text.split('\ r','\ n');
这也是毫无意义的,因为你可以从TextBox中获取线条属性。但为什么你需要单独处理每一行?
 

约翰

C#论坛主持人
工作人员
加入
2011年4月23日
消息
1,154
地点
挪威
编程经验
10+
为什么你仍然认为你需要在regex.replace之前regex.match? Regex.Replace将匹配并替换如果有匹配项。为什么添加另一场比赛?毫无意义,正如我所说的那样,你只是添加没有影响的CPU周星。
regex.replace方法说:

回报​

细绳
除了替换字符串替换每个匹配的字符串之外,一个与输入字符串相同的新字符串。如果在当前实例中不匹配模式,则该方法返回当前实例不变。
 

颂歌

众所周知的成员
加入
2020年12月11日
消息
122
编程经验
Beginner
它只是一个数组,因为你将字符串拆分为数组。

这也是毫无意义的,因为你可以从TextBox中获取线条属性。但为什么你需要单独处理每一行?
C#:
string[] tempArray = strInput.Lines;

我认为这不适用于WPF?由于它被称为MSDN上的Winform命名空间,并且我收到错误。

我知道这是C#通用,因为问题没有特定于WPF它是更多的语法相关。

为什么你仍然认为你需要在regex.replace之前regex.match? Regex.Replace将匹配并替换如果有匹配项。为什么添加另一场比赛?毫无意义,正如我所说的那样,你只是添加没有影响的CPU周星。

我会再次看它,但这并不简单地删除regex.match的问题。

它可能会缩短到我所收集的输出的地方,我会看看它,但目前为止:

C#:
foreach (var result in test)
            {
                foreach (var item in dict)
                {
                    outPut = Regex.Replace(result, item.Key, item.Value);
                    
                }
                strOut.Text += outPut + Environment.NewLine;
            }

投放:

David W / 2 Wilkins
大卫或戴维
威廉和威廉姆斯
"Trevor Phillips"

回来:

David W / 2 Wilkins
大卫或戴维
威廉和威廉姆斯
"Trevor Phillips"

如果我在if语句中缠绕输出= regex.replace:

C#:
if (Regex.IsMatch(result, item.Key))
                    {
                        outPut = Regex.Replace(result, item.Key, item.Value);
                    }

投放:

David W / 2 Wilkins
大卫或戴维
威廉和威廉姆斯
"Trevor Phillips"

回来:

David W / 2 Wilkins
大卫或戴维
威廉和威廉姆斯
特雷弗菲利普斯

它与我的正则表达式匹配。
 

颂歌

众所周知的成员
加入
2020年12月11日
消息
122
编程经验
Beginner
我知道为什么这样做,因为在第二个Dict循环中,结果仍然是原始结果,如果没有If语句,则正则表达式再次查看结果,并说,没有结果很好 - 原始结果。

由于它没有改变结果匹配时,它正在更改输出。

您无法使其结果= regex.replace - 因为结果是Foreach循环的一部分,它不会让您执行此操作。
 

颂歌

众所周知的成员
加入
2020年12月11日
消息
122
编程经验
Beginner
@Johnh. 谢谢你的耐心......

是的,我重新阅读了你所说的一切,我觉得我错过了一些东西。

我可以将InputString作为一个字符串放在一个字符串中,不要求在每行上进行循环 - 是您想要告诉我的,我太密集了。

谢谢,继续砰砰直跳。

不仅如此容易,但它很快就很快。

道歉它需要我多人阅读。
 

约翰

C#论坛主持人
工作人员
加入
2011年4月23日
消息
1,154
地点
挪威
编程经验
10+
您无法使其结果= regex.replace - 因为结果是Foreach循环的一部分,它不会让您执行此操作。
有一个简单的解决方案,它被称为a 多变的 :)将循环分配给单独的变量以使用。
InputString作为单个字符串
不仅如此容易,但它很快就很快。
伟大的!
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,867
地点
切萨皮克,va.
编程经验
10+
你为什么翻倍的工作?首先,您调用match(),然后如果有匹配项,则会调用replace()。知道替换()如果没有匹配,则不会更改任何内容,只需直接调用replace()。
 

颂歌

众所周知的成员
加入
2020年12月11日
消息
122
编程经验
Beginner
你为什么翻倍的工作?首先,您调用match(),然后如果有匹配项,则会调用replace()。知道替换()如果没有匹配,则不会更改任何内容,只需直接调用replace()。
是的,我花了一段时间来了解你可以从文本框中输入16,000行的字符串,regex.replace将在所有内容中工作,并为您提供您期望的输出。

我只是假设你必须通过它来运行每一行,但它是不是 远的 比那更好。
 
最佳 底部