Zapier 中的 RegExp 不返回任何值
RegExp in Zapier not returning any values
我正在尝试从 Zapier 中的不和谐消息中提取一些值。
消息的内容应该看起来像这样(几乎像 YAML):
channel: <#1234567890123456789>
as: Bot nicname
image: http://example.com/
content:
Hello, world!
其中 image
和 as
字段是可选的。
我创建了 2 个正则表达式来完成这个任务:
Python:
import re
r = re.compile(r"(?:channel:)? ?<#(?P<channel>\d+)>\n+(?:as: ?(?P<as>.+)\n+)?(:?image: ?(?P<image>.+)\n+)?content:\n*(?P<content>[\s\S]+)")
JS:
let r = /(?:channel:)? ?<#(?<channel>\d+)>\n+(?:as: ?(?<as>.+)\n+)?(?:image: ?(?<image>.+)\n+)?content:\n*(?<content>[\s\S]+)/;
我尝试了什么:
在 regexr and pythex 中测试正则表达式。两者都适合我。
然后我将它们输入到 Zapier:
- In the Text->Formatter by Zapier->Extract pattern - returns
_matched: false
- In the Run Python field
output 来自 python 代码:
groups: null
id: <ID>
runtime_meta:
memory_used_mb: 57
duration_ms: 3
logs:
1. re.compile('(?:channel:)? ?<#(?P<channel>\d+)>\n+(?:as: ?(?P<nick>.+)\n+)?(:?image: ?(?P<image>.+)\n+)?content:\n*(?P<content>[\s\S]+)')
2. 'channel: <#1234567890123456> \nas: bot nickname\ncontent:\nHello, world!'
3. None
(后来在 运行 JavaScript 中有类似的结果)
什么有效(有点):
尝试调试时,我删除了正则表达式的 image
部分(在 Text->Extract 表达式中):
(?:channel:)? ?<#(?P<channel>\d+)>\n+(?:as: ?(?P<as>.+)\n+)?content:\n*(?P<content>[\s\S]+)
随着输入:
channel: <#1234567890123456>
as: INFO
content:
Hello, world!
结果如预期:
output:
0: 1234567890123456
1: INFO
2: Hello, world!
_end: 68
_matched: true
_start: 0
as: INFO
channel: 1234567890123456
content: Hello, world!
感谢任何让它工作的帮助:)
你可以匹配 0 个或多个 whitespaces 除了使用 [^\S\r\n]*
的换行符。使用 \s*
匹配 0+ 次任何白色 space 字符,包括换行符。
使用 ?
可选择匹配单个 space。
根据你要匹配的字符串,可以决定在同一行匹配space个,或者是否也接受跨行
您可以将模式更新为:
(?:channel:)?[^\S\r\n]*<#(?P<channel>\d+)>\s*\n(?:as:[^\S\r\n]*(?P<as>.+)\n+)?(:?image:[^\S\r\n]*(?P<image>.+)\n+)?content:\n*(?P<content>[\s\S]+)
我正在尝试从 Zapier 中的不和谐消息中提取一些值。 消息的内容应该看起来像这样(几乎像 YAML):
channel: <#1234567890123456789>
as: Bot nicname
image: http://example.com/
content:
Hello, world!
其中 image
和 as
字段是可选的。
我创建了 2 个正则表达式来完成这个任务:
Python:
import re
r = re.compile(r"(?:channel:)? ?<#(?P<channel>\d+)>\n+(?:as: ?(?P<as>.+)\n+)?(:?image: ?(?P<image>.+)\n+)?content:\n*(?P<content>[\s\S]+)")
JS:
let r = /(?:channel:)? ?<#(?<channel>\d+)>\n+(?:as: ?(?<as>.+)\n+)?(?:image: ?(?<image>.+)\n+)?content:\n*(?<content>[\s\S]+)/;
我尝试了什么:
在 regexr and pythex 中测试正则表达式。两者都适合我。
然后我将它们输入到 Zapier:
- In the Text->Formatter by Zapier->Extract pattern - returns
_matched: false
- In the Run Python field
output 来自 python 代码:
groups: null
id: <ID>
runtime_meta:
memory_used_mb: 57
duration_ms: 3
logs:
1. re.compile('(?:channel:)? ?<#(?P<channel>\d+)>\n+(?:as: ?(?P<nick>.+)\n+)?(:?image: ?(?P<image>.+)\n+)?content:\n*(?P<content>[\s\S]+)')
2. 'channel: <#1234567890123456> \nas: bot nickname\ncontent:\nHello, world!'
3. None
(后来在 运行 JavaScript 中有类似的结果)
什么有效(有点):
尝试调试时,我删除了正则表达式的 image
部分(在 Text->Extract 表达式中):
(?:channel:)? ?<#(?P<channel>\d+)>\n+(?:as: ?(?P<as>.+)\n+)?content:\n*(?P<content>[\s\S]+)
随着输入:
channel: <#1234567890123456>
as: INFO
content:
Hello, world!
结果如预期:
output:
0: 1234567890123456
1: INFO
2: Hello, world!
_end: 68
_matched: true
_start: 0
as: INFO
channel: 1234567890123456
content: Hello, world!
感谢任何让它工作的帮助:)
你可以匹配 0 个或多个 whitespaces 除了使用 [^\S\r\n]*
的换行符。使用 \s*
匹配 0+ 次任何白色 space 字符,包括换行符。
使用 ?
可选择匹配单个 space。
根据你要匹配的字符串,可以决定在同一行匹配space个,或者是否也接受跨行
您可以将模式更新为:
(?:channel:)?[^\S\r\n]*<#(?P<channel>\d+)>\s*\n(?:as:[^\S\r\n]*(?P<as>.+)\n+)?(:?image:[^\S\r\n]*(?P<image>.+)\n+)?content:\n*(?P<content>[\s\S]+)