首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Regex没有得到所有的事件,但只得到了最后一个

Regex没有得到所有的事件,但只得到了最后一个
EN

Stack Overflow用户
提问于 2018-01-30 14:19:34
回答 1查看 53关注 0票数 0

我有以下正则表达式:(?:cassy\.jobs \((?:([a-z]+(?:_[a-z]+)?) [a-z]+(?:, )?)+(?:PRIMARY KEY \(([a-z]+(?:_[a-z]+)?)\)\))?)

还有折叠式弦:

代码语言:javascript
复制
CREATE TABLE cassy.jobs (job_id int, job_description text, maximum_salary double, minimum_salary double, PRIMARY KEY (job_id)) WITH read_repair_chance = 0.0 AND dclocal_read_repair_chance = 0.1 AND gc_grace_seconds = 864000 AND bloom_filter_fp_chance = 0.01 AND caching = { 'keys' : 'ALL', 'rows_per_partition' : 'NONE' } AND comment = '' AND compaction = { 'class' : 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold' : 32, 'min_threshold' : 4 } AND compression = { 'chunk_length_in_kb' : 64, 'class' : 'org.apache.cassandra.io.compress.LZ4Compressor' } AND default_time_to_live = 0 AND speculative_retry = '99PERCENTILE' AND min_index_interval = 128 AND max_index_interval = 2048 AND crc_check_chance = 1.0 AND cdc = false;, CREATE TABLE cassy.employees (employee_id int, email_add text, frst_name text, hire_date date, job_id int, last_name text, salary double, PRIMARY KEY (employee_id)) WITH read_repair_chance = 0.0 AND dclocal_read_repair_chance = 0.1 AND gc_grace_seconds = 864000 AND bloom_filter_fp_chance = 0.01 AND caching = { 'keys' : 'ALL', 'rows_per_partition' : 'NONE' } AND comment = '' AND compaction = { 'class' : 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold' : 32, 'min_threshold' : 4 } AND compression = { 'chunk_length_in_kb' : 64, 'class' : 'org.apache.cassandra.io.compress.LZ4Compressor' } AND default_time_to_live = 0 AND speculative_retry = '99PERCENTILE' AND min_index_interval = 128 AND max_index_interval = 2048 AND crc_check_chance = 1.0 AND cdc = false;]

我希望捕获给定表的列名和主键(如果存在的话),但我只获得第一个捕获组和主键的最后出现。

我读过关于“重复捕获组与捕获重复组”的文章,但是解决方案似乎不起作用。经过几个小时的搜寻,我找不到答案。

我得到的是:

代码语言:javascript
复制
group #1: minimum_salary
group #2: job_id

结果应该是:

代码语言:javascript
复制
group #1: job_id
group #2: job_description
group #3: maximum_salary
group #4: minimum_salary
group #5: job_id

编辑:添加了java标记,如果这不能单独使用regex,则可以使用java代码。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-30 15:23:50

使用regex是可能的,但是需要2才能得到最终结果。使用regex的缩写,除了第二个regex之外,我们还可以从这个特定的表中提取列名:

代码语言:javascript
复制
regex1 = /(?:cassy\.jobs \(.*?\))/
regex2 = /(?:\s*([a-z_]+) [a-z]+|PRIMARY KEY\s\((.*?)\))/gm

在Java中不是最有知识的,但在JS中,我会这样做:

代码语言:javascript
复制
let regex1 = /(?:cassy\.jobs \(.*?\))/,
  regex2 = /(?:\s*([a-z_]+) [a-z]+|PRIMARY KEY\s\((.*?)\))/gm,
  string = "CREATE TABLE cassy.jobs (job_id int, job_description text, maximum_salary double, minimum_salary double, PRIMARY KEY (job_id)) WITH read_repair_chance = 0.0 AND dclocal_read_repair_chance = 0.1 AND gc_grace_seconds = 864000 AND bloom_filter_fp_chance = 0.01 AND caching = { 'keys' : 'ALL', 'rows_per_partition' : 'NONE' } AND comment = '' AND compaction = { 'class' : 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold' : 32, 'min_threshold' : 4 } AND compression = { 'chunk_length_in_kb' : 64, 'class' : 'org.apache.cassandra.io.compress.LZ4Compressor' } AND default_time_to_live = 0 AND speculative_retry = '99PERCENTILE' AND min_index_interval = 128 AND max_index_interval = 2048 AND crc_check_chance = 1.0 AND cdc = false;, CREATE TABLE cassy.employees (employee_id int, email_add text, frst_name text, hire_date date, job_id int, last_name text, salary double, PRIMARY KEY (employee_id)) WITH read_repair_chance = 0.0 AND dclocal_read_repair_chance = 0.1 AND gc_grace_seconds = 864000 AND bloom_filter_fp_chance = 0.01 AND caching = { 'keys' : 'ALL', 'rows_per_partition' : 'NONE' } AND comment = '' AND compaction = { 'class' : 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold' : 32, 'min_threshold' : 4 } AND compression = { 'chunk_length_in_kb' : 64, 'class' : 'org.apache.cassandra.io.compress.LZ4Compressor' } AND default_time_to_live = 0 AND speculative_retry = '99PERCENTILE' AND min_index_interval = 128 AND max_index_interval = 2048 AND crc_check_chance = 1.0 AND cdc = false;]",
  createTable = regex1.exec(string),
  columnNames = [];

// Put all capture group matches into the columnNames array
while ((m = regex2.exec(createTable)) !== null) {
  m.forEach((match, groupIndex) => {
    if (match !== undefined && groupIndex !== 0) {
      columnNames.push(match)
    }
  });
}

console.log(columnNames)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48523615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档