- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在尝试构建一个对输入长度施加限制的正则表达式,但并非所有字符在此长度上都相等。我会把理由放在问题的底部。作为一个简单的例子,我们将最大长度限制为 12,并且只允许 a
和 b
,但是 b
算作 3 个字符。
允许的是:
aa
(任何小于 12 的都可以)。aaaaaaaaaaaa
(恰好 12 就可以)。aaabaaab
(6 + 2 * 3 = 12,这很好)。abaaaaab
(仍然是 6 + 2 * 3 = 12)。不允许的是:
aaaaaaaaaaaaa
(13 个 a
)。bbbba
(1 + 4 * 3 = 13,太多了)。baaaaaaab
(7 + 2 * 3 = 13,太多了)。我做了一个相当接近的尝试:
^(a{0,3}|b){0,4}$
这最多匹配 4 个簇,可能包含 0-3 个 a
或一个 b
。
但是,它无法匹配我的最后一个正例:abaaaaab
,因为这迫使第一个集群在开始时成为单个 a
,消耗了第二个集群对于 b
,然后只为其余的 aaaaab
留下 2 个簇,这太长了。
为什么我需要使用正则表达式来执行此操作?
它用于通过 PyQt 和 QML 在 Qt 中的用户界面。用户可以在此处的文本字段中为配置文件键入名称。此配置文件名称经过 url 编码(特殊字符由 %XX 代替),然后保存在用户的文件系统中。当用户键入大量特殊字符(例如中文)然后将其编码为非常长的文件名时,我们会遇到问题。事实证明,在大约 17 个字符的地方,这个文件名对于某些文件系统来说变得太长了。 URL 编码编码为 UTF-8,每个字符最多 4 个字节,导致文件名中最多 12 个字符(因为每个字符都经过百分比编码)。
16 个字符对于个人资料名称来说太短了。甚至我们的一些默认名称也超过了这个范围。我们需要基于这些特殊字符的可变限制。
Qt 通常允许您指定一个验证器来确定哪些值在文本框中是可接受的。我们尝试实现这样的验证器,但由于 PyQt 中的错误,导致上游出现段错误。它目前似乎无法处理自定义验证器实现。但是,PyQt 还公开了三个内置验证器。两个仅适用于数字。第三个是正则表达式验证器,它允许您放置匹配所有有效字符串的正则表达式。因此需要这个正则表达式。
最佳答案
考虑到正则表达式的局限性,没有真正直接的方法可以做到这一点。您将必须测试所有组合,例如十三个 b
和最多一个 a
,十二个 b
和最多四个 a
,依此类推。我们将构建一个小程序来为我们生成这些。测试最多四个 a
的基本格式是
/^(?=([^a]*a){0,4}[^a]*$)/
我们将编写一个小程序来为我们创建这些前瞻,给定一些字母以及出现的最小和最大次数:
function matchLetter(c, m, n) {
return `(?=([^${c}]*${c}){${m},${n}}[^${c}]*$)`;
}
> matchLetter('a', 0, 4)
< "(?=([^a]*a){0,4}[^a]*$)"
我们可以结合这些来测试三个 b
和最多三个 a
:
/^(?=([^b]*b){3}[^b]*$)(?=([^a]*a){0,3}[^a]*$)/
我们将编写一个函数来创建这样的组合前瞻,它完全匹配 m
次 c1
和最多 n
次 c2
:
function matchTwoLetters(c1, m, c2, n) {
return matchLetter(c1, m, m) + matchLetter(c2, 0, n);
}
我们可以使用它来匹配十二个 b
和最多四个 a
,总共四十个或更少:
> matchTwoLetters('b', 12, 'a', 1, 4)
< "(?=([^b]*b){12,12}[^b]*$)(?=([^a]*a){0,4}[^a]*$)"
剩下的就是为 b
的每个计数简单地创建这个版本,并将它们放在一起(对于最大计数为 12 的情况):
function makeRegExp() {
const res = [];
for (let bs = 0; bs <= 4; bs++)
res.push(matchTwoLetters('b', bs, 'a', 12 - bs*3));
return new RegExp(`^(${res.join('|')})`);
}
> makeRegExp()
< "^((?=([^b]*b){0,0}[^b]*$)(?=([^a]*a){0,12}[^a]*$)|(?=([^b]*b){1,1}[^b]*$)(?=([^a]*a){0,9}[^a]*$)|(?=([^b]*b){2,2}[^b]*$)(?=([^a]*a){0,6}[^a]*$)|(?=([^b]*b){3,3}[^b]*$)(?=([^a]*a){0,3}[^a]*$)|(?=([^b]*b){4,4}[^b]*$)(?=([^a]*a){0,0}[^a]*$))"
现在你可以用
做测试了makeRegExp().test("baabaaa");
对于长度=40 的情况,regxp 的长度为 679 个字符。一个非常粗略的基准表明它的执行时间不到一微秒。
关于javascript - 正则表达式字符计数,但有些计数为三个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40296630/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及预
为什么在 C# 中添加两个 char 结果是 int 类型? 例如,当我这样做时: var pr = 'R' + 'G' + 'B' + 'Y' + 'P'; pr 变量变为 int 类型。我希望它是
下面的代码可以编译,但 char 类型的行为与 int 类型的行为不同。 特别是 cout ::ikIsX >() ::ikIsX >() ::ikIsX >() using names
我正在寻找一个正则表达式,它可以匹配长度为 1 个或多个字符但不匹配 500 的内容。这将在 Rails 路由文件中使用,特别是用于处理异常。 路线.rb match '/500', to: 'err
对于 C 编程作业,我正在尝试编写几个头文件来检查所谓的“X 编程语言”的语法。我最近才开始,正在编写第一个头文件。这是我编写的代码: #ifndef _DeclarationsChecker_h_
为什么扩展的 ascii 字符(â、é 等)被替换为 字符? 我附上了一张图片...但我正在使用 PHP 从 MySQL 中提取数据,其中一些位置有扩展字符...我使用的是 Arial 字体。 您可以
我有一个与 R 中的断线相关的简单问题。 我正在尝试粘贴,但在获取(字符/数字)之间的断线时遇到问题。请注意,这些值包含在向量中(V1=81,V2=55,V3=25)我已经尝试过这段代码: cat(p
如何将 ANSI 字符 (char) 转换为 Unicode 字符 (wchar_t),反之亦然? 是否有用于此目的的任何跨平台源代码? 最佳答案 是的,在 中你有mbstowcs()和 wcsto
函数 fromCharCode 不适用于国际 ANSI 字符。例如,对于 ID 为 192 到 223 的俄语 ANSI (cp-1251) 字符,它返回特殊字符。如何解决这个问题? 我认为,需要将A
如果不喜欢,我想隐藏 id,但不起作用 SELECT * FROM character, character_actor WHERE character.id NOT LIKE character_a
现在这个程序成功地反转了键盘输入的单词。但是我想在我反转它之前“保存”指针中的单词,所以我可以比较两者,反转的和“原始的”,并检查它们是否是回文。我还没有太多经验,可能会出现比我知道的更多的错误,但我
Memcpy 和 memcmp 函数可以接受指针变量吗? char *p; char* q; memcpy(p,q,10); //will this work? memcmp(p,q,10); //w
恐怕我对一个相当过饱和的主题的细节有疑问,我搜索了很多,但找不到一个明确的答案来解决这个特定的明显-imho-重要的问题: 使用UTF-8将byte[]转换为String时,每个字节(8bit)都变成
我有一个奇怪的问题。我需要从 stat 命令打印输出字符串。 我已经编写了获取一些信息的代码。 import glob import os for file in glob.glob('system1
我正在使用 Java 并具有其值如下所示的字符串, String data = "vale-cx"; data = data.replaceAll("\\-", "\\-\\"); 我正在替换其中的“
String urlParameters = "login=test&password=te&ff"; 我有一个String urlParams,& - 是密码的一部分,如何使其转义,从而不被识别为分
大家好,我只想从此字符串中提取第一个字母: String str = "使 徒 行 傳 16:31 ERV-ZH"; 我只想获取这些字符: 使 徒 行 傳 并且不包括 ERV-ZH 仅数
这个问题已经有答案了: Crash or "segmentation fault" when data is copied/scanned/read to an uninitialized point
所以, 我有一个字符**;它本质上是一个句子,带有指向该句子中每个单词的指针;即 'h''i''\0''w''o''r''l''d''\0''y''a''y''!''\0' 在这种情况下,我希望使用可
这个问题在这里已经有了答案: Using quotation marks inside quotation marks (12 个答案) 关闭 7 年前。 如何打印 " 字符? 我知道打印 % 符号
我是一名优秀的程序员,十分优秀!