当前位置: 首页 > 知识库问答 >
问题:

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

商琛
2023-03-14

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

之前:

这是一个示例标题黑色-世界2019T.E.S.T.(测试)“测试”“测试”[测试]

之后:

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

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

我想我会识别每个以大写字母开头的单词。

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

附加规则:

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

C#

https://rextester.com/GAZJS38767

// Title without spaces
string title = "ThisIsAnExampleTitleHELLO-WORLD2019T.E.S.T.(Test)[Test]\"Test\"'Test'";

// Detect where to space words
string[] split =  Regex.Split(title, "(?<!^)(?=(?<![.\\-'\"([{])[A-Z][\\d+]?)");

// Trim each word of extra spaces before joining
split = (from e in split
         select e.Trim()).ToArray();

// Join into new title
string newtitle = string.Join(" ", split);

// Display
Console.WriteLine(newtitle);

正则表达式

我在数字、括号、圆括号和引号前的空格方面有困难。

https://regex101.com/r/9IIYGX/1

(?<!^)(?=(?<![.\-'"([{])(?<![A-Z])[A-Z][\d+?]?)

(?<!^)          // Negative look behind

(?=             // Positive look ahead

(?<![.\-'"([{]) // Ignore if starts with punctuation
(?<![A-Z])      // Ignore if starts with double Uppercase letter
[A-Z]           // Space after each Uppercase letter
[\d+]?          // Space after number

)

感谢您的共同努力。这是一个正则表达式的例子。我将它应用于文件名,并排除特殊字符\/:*?"

https://rextester.com/FYEVE73725

https://regex101.com/r/xi8L4z/1


共有3个答案

萧芷阳
2023-03-14

为了简单起见,而不是大型正则表达式,我建议使用小型简单模式编写此代码(带解释的注释在代码中):

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, @"(?<=[)\]""'])", " ");
全飞扬
2023-03-14

前几个部分类似于@revo答案:(?

请注意,|是或运算符,它允许执行所有正则表达式。

正则表达式: (?

演示

简单介绍一下:

来自:(?

改为:(?

<代码>((?

最终正则表达式:(?

演示

伊羽
2023-03-14

下面是一个正则表达式,它看起来很好用,至少对您的示例输入来说是这样的:

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

这个模式说在以下条件之一的边界上进行分割:

  • 前面是小写,前面是大写(反之亦然)
  • 前面是数字,后面是字母(反之亦然)
  • 前面和后面是非单词字符(例如引号、括号等)

< br >

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'

注意:您可能还想将此断言添加到regex选项中:

(?<=\W)(?=\w)|(?<=\w)(?=\W)

我们在这里侥幸逃脱了,因为这种边界条件从未发生过。但是,您可能需要将它与其他输入一起使用。

 类似资料:
  • 给我一个字符串“23 45”,我需要得到两个值为23的变量(int a)和值为45的变量(int b)

  • 问题内容: 我有一个电话号码(字符串),例如“ + 123-456-7890”,我想将其变成一个列表,如下所示:[+,1,2,3,-,....,0]。 为什么?因此,我可以遍历列表并删除所有符号,因此只剩下一个数字列表,然后可以将其转换回字符串。 解决此问题的最佳方法是什么?我遇到的所有解决方案均不适用,因为在数字之间没有任何特殊字符(因此我无法在其中分割字符串。) 有任何想法吗?我真的很感激!

  • 问题内容: 我有一个像这样的字符串: 我正在尝试在Python中编写一些内容,以按空格将其拆分,同时忽略引号内的空格。我正在寻找的结果是: PS。我知道你会问:“如果引号内有引号,那么在我的应用程序中,将永远不会发生。 问题答案: 你需要从内置模块中。 这应该正是你想要的。

  • 问题内容: 欲分割为4的阵列,以利用 这是我的代码: 但是,结果标记是一个空数组:[],而不是 我想要的4数组。 我已经测试过更改一点: 这次的结果标记为。这与我想要的接近,但是我真的不想在拆分之前添加此“ 1”。 问题基本上是,如果它仅包含空元素,它将返回一个空数组。 您能帮助解决问题吗? 问题答案: 您需要使用带有limit参数的重载方法。 从文档(重点是我的): limit参数控制应用图案的

  • 问题内容: 我需要一个类似于的函数,但可能会有多个空格,并且有意义的字符之间的空格数也不相同。像这样: 我可以以某种方式使用正则表达式来捕捉它们之间的空格吗? 问题答案: 如果您不向传递任何参数,它将把空格运行视为单个分隔符: 或者如果你想

  • 问题内容: 这个问题很简单,但是我敢打赌,在这里询问可能比尝试理解有关以下文档的方法更直接: 观察值为“ 12,345”。 期望值为“ 12345”。 问题答案: 只需使用