正则表达式如何忽略子字符串中的内容

2022-11-15 11:20:05 +08:00
 itskingname

我有一批字符串,他们的格式是这样的:

a = 'abc[账号]def[密码]xyz'

b = 'aaa[账号]还有"子字符串[无效内容]子字符串"bbb[密码]zzz'

我想提取所有中括号里面的内容,但忽略双引号内部的中括号中的内容。

以上面两个字符串 a 和 b 为例,需要提取的内容都是『账号』和『密码』

目前我能想到的办法是使用状态机来做。请问有没有使用正则表达式就能实现的方法?

947 次点击
所在节点    正则表达式
12 条回复
youdoit
2022-11-15 11:31:39 +08:00
[ ^\[\] ]
itskingname
2022-11-15 11:33:35 +08:00
@youdoit 你这个怎么忽略双引号呢?
youdoit
2022-11-15 11:52:30 +08:00
@itskingname 代码做到,比如把[ ]替换成空
Hylenbin
2022-11-15 11:59:14 +08:00
用正则的“断言”应该就可以实现
Hylenbin
2022-11-15 12:04:30 +08:00
接上,给个不严谨的例子供参考,(?<!”.*)([.*])(?!”.*)
my8100
2022-11-15 12:52:56 +08:00
“忽略双引号内部的中括号中的内容”,既然这么明确,为啥不先 re.sub 一次将无关内容替换为空字符串?
Pipecraft
2022-11-15 14:18:27 +08:00
这段正则表达式也许可以


```js
function findMatched(str) {
const matched = [];
str.replace(/"[^"]+"|(\[[^\[\]"]+\])/g, (a, b) => {
if (b) {
matched.push(b);
}
});
return matched;
}

a = "abc[账号]def[密码]xyz";

b = 'aaa[账号]还有"子字符串[无效内容]子字符串"bbb[密码]zzz';

c = 'a"a[a]a"a[账号]还有"子字符串[无效内容]子字符串"bbb[密码]z"zz[其他]abcd';

console.log(findMatched(a));
console.log(findMatched(b));
console.log(findMatched(c));
```
Pipecraft
2022-11-15 14:22:31 +08:00
@Pipecraft #7
上面那段正则稍微修改一点。
```js
/"[^"]*"|(\[[^\[\]]+\])/g
```
ezking
2022-11-15 15:19:11 +08:00
/(?<!".*?)\[[^\[\]]*?\]|\[[^\[\]]*?\](?!.*?")/g
拿去用吧
ezking
2022-11-15 15:23:05 +08:00
不过最好去除("xxx") 再找内容
itskingname
2022-11-15 15:33:07 +08:00
@my8100 因为我是要把外层的[xxx]替换成其他内容,子字符串中的内容不动。
temberature
338 天前
Model: GPT-4

User
输入:```abc[tember]def[134523]xyz
aaa[tiandatong]还有"子字符串[无效内容]子字符串"bbb[324512]zzz```
预期输出结果:```tember 134523
tiandatong 324512```
- 使用 JavaScript 写正则表达式替换文本
- 基于状态机的思路,进行模式的切换和循环

ChatGPT
在这个问题中,你想要的似乎是在两个方括号之间提取内容,并且这些方括号之间的内容是指定的字符串,或者方括号之后有一段特定的数字。

我们可以使用 JavaScript 中的正则表达式来做到这一点。以下是一种可能的解决方案,基于状态机的思路,进行模式的切换和循环:

javascript
Copy code
let input = `abc[tember]def[134523]xyz
aaa[tiandatong]还有"子字符串[无效内容]子字符串"bbb[324512]zzz`;

let keywordReg = /\[([a-z]+)\]|(\[([0-9]+)\])/gim;

let expectedOutput = "";
let keywordFlag = false;

input.replace(keywordReg, function(match, p1, p2, p3) {
if (p1) {
if (keywordFlag) {
expectedOutput += " ";
}
expectedOutput += p1;
keywordFlag = true;
} else if (p3) {
if (keywordFlag) {
expectedOutput += " " + p3;
expectedOutput += "\n";
keywordFlag = false;
}
}
});

console.log(expectedOutput.trim());
这段代码首先定义了一个正则表达式,用于在输入字符串中匹配两种模式,一种是在方括号内包含一个或多个小写字母的模式,另一种是在方括号内包含一个或多个数字的模式。

然后,代码使用 replace 方法,这个方法接受一个正则表达式和一个回调函数。对于输入字符串中的每一个匹配,它都会调用这个回调函数。在回调函数中,我们检查每个匹配项,如果匹配项是一个关键词(即在方括号内包含字母),我们将其添加到预期的输出字

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/895346

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX