C# 将不带空格的标题字符串分隔为单词

C# 将不带空格的标题字符串分隔为单词,c#,regex,C#,Regex,我想在没有空格的标题中找到并分隔单词 之前: 例如TitleHello-WORLD2019T.E.S.T.(测试)“测试”即“测试”[测试] 之后: 这是一个示例标题HELLO-WORLD 2019 T.E.S.T.(测试)[测试]“测试”‘测试’ 我正在寻找一个正则表达式规则,它可以执行以下操作 我想如果每个单词都以大写字母开头,我会识别出来 但也要保留所有大写单词,以免将它们分隔成一个L L U p E R C A S E 其他规则: 如果字母与数字接触,请在空格中加空格:Hello20

我想在没有空格的标题中找到并分隔单词

之前:

例如TitleHello-WORLD2019T.E.S.T.(测试)“测试”即“测试”[测试]

之后:

这是一个示例标题HELLO-WORLD 2019 T.E.S.T.(测试)[测试]“测试”‘测试’


我正在寻找一个正则表达式规则,它可以执行以下操作

我想如果每个单词都以大写字母开头,我会识别出来

但也要保留所有大写单词,以免将它们分隔成
一个L L U p E R C A S E

其他规则:

  • 如果字母与数字接触,请在空格中加空格:
    Hello2019World
    Hello 2019 World
  • 忽略包含句点、连字符或下划线的间隔首字母
    T.E.S.T.
  • 忽略括号、括号或引号之间的间距
    [Test](Test)“Test”和“Test”
  • 保留连字符
    Hello World

C#

//不带空格的标题
string title=“Thisisanexampletilehello-WORLD2019T.E.S.T.(测试)[Test]\“测试\”“测试'”;
//检测单词的空格位置
string[]split=Regex.split(标题,(?)?

(?|


这里有一个正则表达式,它似乎工作得很好,至少对于您的示例输入:

(?<=[a-z])(?=[A-Z])|(?<=[0-9])(?=[A-Za-z])|(?<=[A-Za-z])(?=[0-9])|(?<=\W)(?=\W)

(?您可以通过对正则表达式的不同解释来减少缩短其步骤的要求。例如,第一个要求与以下要求相同:保留大写字母,前提是它们前面没有标点符号或大写字母。

以下正则表达式几乎适用于所有提及的要求,并且可以扩展到包括或排除其他情况:

(?<!^|[A-Z\p{P}])[A-Z]|(?<=\p{P})\p{P}

为了简单而不是巨大的正则表达式,我建议使用小的简单模式(注释和解释在代码中):

string str=“ThisisanexampletTitleHello-WORLD2019T.E.S.T.(测试)\“测试\”“测试”[测试]”;
//当小写字母后跟大写字母时,请插入空格

str=Regex.Replace(str),(?前几个部分类似于:
(?),另外,我在数字和字母之间的空格中添加了以下正则表达式:
(?)是允许执行所有正则表达式的or运算符

正则表达式:

更新 即兴创作一点:

发件人:

进入:
(?它们做同样的事情


((?即兴创作,在某些标点符号中添加例外:
(((?我之所以投票,是因为这是我在数小时内看到的第一篇包含适当数量的信息、研究和信息的帖子effort@MichaelRandall不幸的是,这比我在大多数周末看到的情况要好。这是一种有趣的方式。通过间隔e
2019
?添加
(?我还有一个问题,像
A
I
这样的单字母单词不会空格。
ATitleExample
变成
ATitleExample
。像
OTPIsADevice
这样的东西怎么样?它开始变得复杂。
OTPIs-ADevice
也许我可以通过第二个过滤器运行输出。规则:如果一个单词以h 2个大写字母
ADevice
,在第一个字母
a Device
后添加一个空格。如果
所有大写字母都以
小写字母结尾,则在最后两个字母
OTP
之前添加一个空格。我遇到了一个问题,当涉及到像
a
这样的单字母单词时ode>I
,它不会分开,因为它使用了
全大写
规则(两个大写字母相邻).
ATitleExample
变成
ATitleExample
@mattmmanis这是一个边缘案例,可能会破坏这里给出的所有答案。你需要做更多的工作来涵盖这些CSE。我可以通过第二个正则表达式来运行此输出,以修复这些问题。如果评论是你主要关心的问题,你可以启用x模式或使用内联注释,即
(?#当字母后跟数字时插入空格)
@revo我使用了标准C#注释:)我认为它更具可读性。你也可以通过设置标准的
x
修饰符来编写这种可读的注释,它允许你编写多行缩进的完美注释。顺便说一句,这并不简单。只需拆分即可。这几乎可以完美地工作。最后一部分的某个地方有一个问题
|(((?没有保留括号、方括号和引号。谢谢,您的正则表达式解决了单字母问题。我在末尾添加了一些额外的规则来处理其他问题。
(?<=[a-z])(?=[A-Z])|(?<=[0-9])(?=[A-Za-z])|(?<=[A-Za-z])(?=[0-9])|(?<=\W)(?=\W)
string title = "ThisIsAnExampleTitleHELLO-WORLD2019T.E.S.T.(Test)[Test]\"Test\"'Test'";
string[] split =  Regex.Split(title, "(?<=[a-z])(?=[A-Z])|(?<=[0-9])(?=[A-Za-z])|(?<=[A-Za-z])(?=[0-9])|(?<=\\W)(?=\\W)"); 
split = (from e in split select e.Trim()).ToArray();
string newtitle = string.Join(" ", split);

This Is An Example Title HELLO-WORLD 2019 T.E.S.T. (Test) [Test] "Test" 'Test'
(?<=\W)(?=\w)|(?<=\w)(?=\W)
(?<!^|[A-Z\p{P}])[A-Z]|(?<=\p{P})\p{P}
string input = @"ThisIsAnExample.TitleHELLO-WORLD2019T.E.S.T.(Test)""Test""'Test'[Test]";
Regex regex = new Regex(@"(?<!^|[A-Z\p{P}])[A-Z]|(?<=\p{P})\p{P}", RegexOptions.Multiline);
Console.WriteLine(regex.Replace(input, @" $0"));
string str = "ThisIsAnExampleTitleHELLO-WORLD2019T.E.S.T.(Test)\"Test\"'Test'[Test]";
// insert space when there is small letter followed by upercase letter
str = Regex.Replace(str, "(?<=[a-z])(?=[A-Z])", " ");
// insert space whenever there's digit followed by a ltter
str = Regex.Replace(str, @"(?<=\d)(?=[A-Za-z])", " ");
// insert space when there's letter followed by digit
str = Regex.Replace(str, @"(?<=[A-Za-z])(?=\d)", " ");
// insert space when there's one of characters ("'[ followed by letter or digit
str = Regex.Replace(str, @"(?=[(\[""'][a-zA-Z0-9])", " ");
// insert space when what preceeds is on of characters ])"'
str = Regex.Replace(str, @"(?<=[)\]""'])", " ");