我需要一个正则表达式来选择两个外括号之间的所有文本.
例: some text(text here(possible text)text(possible text(more text)))end text
结果: (text here(possible text)text(possible text(more text)))
似乎stackoverflow上的每个问题,其中提问者使用正则表达式从HTML中获取一些信息将不可避免地有一个"答案",表示不使用正则表达式来解析HTML.
为什么不?我知道那里有引用 - 不引用"真正的"HTML解析器,比如Beautiful Soup,我相信它们是强大而有用的,但是如果你只是做一些简单,快速或肮脏的事情,那么为什么当一些正则表达式语句运行得很好时,麻烦使用如此复杂的东西?
此外,是否有一些基本的东西,我不了解正则表达式,这使得它们一般是解析的错误选择?
我需要在分号上分割这样的字符串.但我不想拆分字符串('或')内的分号.我没有解析文件;只是一个没有换行符的简单字符串.
part 1;"this is ; part 2;";'this is ; part 3';part 4;this "is ; part" 5
结果应该是:
我想这可以用正则表达式完成,但如果没有; 我对另一种方法持开放态度.
标题是问题.以下是我尝试通过研究回答这个问题.但我不相信我不知情的研究,所以我仍然提出问题(在C#中用字符串中的单个字符迭代的最快方法是什么?).
偶尔我想逐个循环遍历字符串的字符,例如在解析嵌套标记时 - 这是正则表达式无法完成的.我想知道最快的方法是迭代字符串中的各个字符,特别是非常大的字符串.
我自己做了一堆测试,结果如下.然而,有许多读者对.NET CLR和C#编译器有更深入的了解,所以我不知道我是否遗漏了一些明显的东西,或者我是否在测试代码中犯了错误.所以我征集你的集体回应.如果有人深入了解字符串索引器的实际工作方式,那将非常有帮助.(这是C#语言功能在幕后编译成其他东西吗?还是内置于CLR中的东西?).
使用流的第一种方法直接取自线程中接受的答案:如何从字符串生成流?
测试
longString是一个9910万字符的字符串,由89个纯文本版本的C#语言规范组成.显示的结果是20次迭代.如果存在'启动'时间(例如方法#3中隐式创建的数组的第一次迭代),我会单独测试它,例如在第一次迭代后断开循环.
结果
从我的测试中,使用ToCharArray()方法在char数组中缓存字符串是迭代整个字符串的最快速度.ToCharArray()方法是一项前期费用,对单个字符的后续访问速度略快于内置索引访问器.
milliseconds
---------------------------------
Method Startup Iteration Total StdDev
------------------------------ ------- --------- ----- ------
1 index accessor 0 602 602 3
2 explicit convert ToCharArray 165 410 582 3
3 foreach (c in string.ToCharArray)168 455 623 3
4 StringReader 0 1150 1150 25
5 StreamWriter => Stream 405 1940 2345 20
6 GetBytes() => StreamReader 385 2065 2450 35
7 GetBytes() => BinaryReader 385 5465 5850 80 …Run Code Online (Sandbox Code Playgroud) 这与正则表达式非常相关,以匹配外部括号,但是,我特别想知道如何或是否可以执行此正则表达式的递归模式?我还没有找到使用这个策略的python示例,所以认为这应该是一个有用的问题!
我已经看到 了一些 索赔 是递归的模式可以用来匹配平衡括号,但使用Python的没有例子正则表达式包(注:重不支持递归模式,你需要使用正则表达式).
一种说法是语法在b(?:m|(?R))*e哪里:
b是什么开始构造,m是什么可以发生在构造的中间,并且e是在构造的末尾可以发生的
我想在以下内容中提取外部大括号的匹配项:
"{1, {2, 3}} {4, 5}"
["1, {2, 3}", "4, 5"] # desired
Run Code Online (Sandbox Code Playgroud)
请注意,对于内括号,这很容易做到:
re.findall(r"{([^{}]*)}", "{1, {2, 3}} {4, 5}")
['2, 3', '4, 5']
Run Code Online (Sandbox Code Playgroud)
(在我的例子中,我使用的是finditer(在匹配对象上),请看这里.)
所以我曾希望以下或某些变体可行:
regex.findall(r"{(:[^{}]*|?R)}", "{1, {2, 3}} {4, 5}")
regex.findall(r"({(:[^{}]*|?R)})", "{1, {2, 3}} {4, 5}")
regex.findall(r"({(:.*|(?R))*})", "{1, {2, 3}} {4, 5}")
regex.findall(r"({(:.*)|(?R)*})", …Run Code Online (Sandbox Code Playgroud) 我有一个像这样的字符串:
Hi my name is John (aka Johnator).
获得括号之间的最佳方法(包括括号)是什么?
我知道这个问题似乎很愚蠢,但事实并非如此.我的意思是它究竟是什么.我对解析问题有一个公平的理解.我知道BNF/EBNF,我在我的一个大学课程中编写语法来解析简单的无语境语言.我以前从未见过正则表达式!我记得的唯一一件事就是无上下文语法可以完成正则表达式所能做的所有事情.
此外,通常的编码解析字符串是否有用?一个简单的例子会有所帮助.
我试图弄清楚如何使用C#正则表达式从字符串中删除所有实例配对括号.应删除括号和它们之间的所有文本.括号并不总是在同一条线上.此外,它们可能是嵌套的括号.字符串的一个例子是
This is a (string). I would like all of the (parentheses
to be removed). This (is) a string. Nested ((parentheses) should) also
be removed. (Thanks) for your help.
Run Code Online (Sandbox Code Playgroud)
所需的输出应如下:
This is a . I would like all of the . This a string. Nested also
be removed. for your help.
Run Code Online (Sandbox Code Playgroud) 我有输入字符串"\\{\\{\\{testing}}}",我想删除所有"\".要求o/p : "{{{testing}}}".
我正在使用以下代码来完成此任务.
protected String removeEscapeChars(String regex, String remainingValue) {
Matcher matcher = Pattern.compile(regex, Pattern.CASE_INSENSITIVE).matcher(remainingValue);
while (matcher.find()) {
String before = remainingValue.substring(0, matcher.start());
String after = remainingValue.substring(matcher.start() + 1);
remainingValue = (before + after);
}
return remainingValue;
}
Run Code Online (Sandbox Code Playgroud)
我正在通过正则表达式"\\\\{.*?\\\\}".
代码仅在第一次出现"\ {"时正常工作,但不适用于所有出现的情况.查看以下输出以了解不同的输入.
"\\{testing}"- o/p:"{testing}" "\\{\\{testing}}"- o/p:"{\\{testing}}""\\{\\{\\{testing}}}"- o/p:"{\\{\\{testing}}}" 我想要"\"从传递的i/p字符串中删除,所有"\\{"应该替换为"{".
我觉得问题在于正则表达式值,即"\\\\{.*?\\\\}".
任何人都可以让我知道什么应该是获得所需的o/p的正则表达式值.
我需要验证给定String的用户并验证它是否是有效的Set,可能是包含内部集的集合.例子:
1) {1, 2, 3, 4} = valid
2) {1, 2, {3, 4}, 5} = valid
3) 1, 2, 3, 4 = invalid (missing brackets)
4) {1, 2, {3, 4, 5} = invalid (missing inner bracket)
Run Code Online (Sandbox Code Playgroud)
这是我正在使用的正则表达式(为便于阅读而分解):
String elementSeparator = "(,\\s)?";
String validElement = "(\\{?[A-Za-z0-9]*\\}?" + elementSeparator + ")*";
String regex = "^\\{" + validElement + "\\}$";
Run Code Online (Sandbox Code Playgroud)
目前它接受带有可选开始和结束括号的集合,但我需要它只接受它们是否存在,而不是如果内部集合缺少一个括号.在我当前的实现中,第4个示例被接受为有效集.
我怎么能做到这一点?