我真的很想学习正则表达式,所以就到这里了。
我真的很想得到一个字符串中没有“/”的所有单词。例如,我需要这样做:“Hello Great /World/” 我需要得到结果:“Hello”“Great”
这在正则表达式中是否可行,如果可以,我该怎么做?我想我希望将结果存储在字符串数组中:)
谢谢
Just use this regular expression \b(?<!/)\w+(?!/)\b
:
var str = "Hello Great /World/ /I/ am great too";
var words = Regex.Matches(str, @"\b(?<!/)\w+(?!/)\b")
.Cast<Match>()
.Select(m=>m.Value)
.ToArray();
This will get you:
Hello
Great
am
great
too
var newstr = Regex.Replace("Hello Great /World/", @"/(\w+?)/", "");
如果你真的想要一个字符串数组
var words = Regex.Matches(newstr, @"\w+")
.Cast<Match>()
.Select(m => m.Value)
.ToArray();
我首先将字符串拆分为数组,然后过滤掉匹配的单词。此解决方案也可能比大的正则表达式更干净,因为您可以更好地发现“单词”和过滤器的要求。
大的正则表达式解决方案类似于单词边界 - 不是斜杠 - 许多无空格 - 不是斜杠 - 单词边界。
我会使用正则表达式替换将所有 /[a-zA-Z]/ 替换为 '' (nothing) 然后获取所有单词
试试这个:(点击这里查看演示)
(\s(?<!/)([A-Za-z]+)(?!/))|((?<!/)([A-Za-z]+)(?!/)\s)
使用此示例摘录:
/character/“_”(下划线/下划线)可以在/变量/名称/in/许多/programming//languages/中/使用/,而/character/“/”(斜线/笔划/solidus)通常是不允许的。
...此表达式匹配任何前后都没有字符的字母、数字、下划线或撇号(英语中“单词”的典型概念/
)字符串-wrapped with a "/"
\b([\w']+)\b(?<=(?<!/)\1|\1(?!/))
...并且是最纯粹的形式,仅使用一个字符类来定义“单词”字符。它与示例匹配如下:
Matched Not Matched
------------- -------------
The character
_ used
underscore variable
under in
strike programming
can languages
be character
in stroke
names
many
while
the
slash
solidus
is
typically
not
allowed
如果不需要排除/stroke/
, ,则在末尾限制中添加一点将允许它,具体取决于您要如何定义“下一个”单词的开头:
\b([\w']+)\b(?<=(?<!/)\1|\1(?!/([^\w]))).
更改(?!/)
为,如果它后面紧跟一个字母、数字或下划线(?!/([^\w]))
,则允许。这将从上面的“不匹配”列表移动到“匹配”列表。/something/
stroke
注意:\w
匹配大写或小写字母、数字和下划线字符
如果您想从上面更改“单词”的概念,只需[\w']
将表达式部分中包含的字符和速记字符类交换[a-zA-Z']
为排除数字或[\w'-]
包含连字符之类的东西,这将捕获under-strike
为单个匹配项,而不是比两个单独的匹配:
\b([\w'-]+)\b(?<=(?<!/)\1|\1(?!/([^\w])))
重要的替代品!!! (我认为)
我只是想到了匹配任何未用符号包裹的单词的替代方法/
:只需消耗所有这些符号和它们包围的单词(拆分)。这有几个好处:没有环视意味着这可以在更多的上下文中使用(JavaScript 不支持环视,一些正则表达式根本不支持环视)同时提高效率;此外,使用拆分表达式意味着字符串数组的直接结果:
string input = "The /character/ "_" (underscore/under-strike) can be..."; //etc...
string[] resultsArray = Regex.Split(input, @"([^\w'-]+?(/[\w]+/)?)+");
瞧!