正则表达式ruby语法选择一个数字,同时排除特定的数字

时间:2016-06-28 07:19:19

标签: ruby regex

尽管有大量的在线文档,我仍然在努力寻找一些ruby正则表达式语法。我有一个字符串数组,我正在寻找包含一个数字(无论数字位数)但不是特定数字的字符串(例如,假设从19XX到201X的日期)。

我设法获得#34的正则表达式;该行包含一个数字"

.*\p{N}.*

如果这个数字是一年"

,我设法得到"排除该行
(?!19\d\d|20[0-1]\d)\d{4}

但我无法将两者结合起来。我需要一些直观地写成的东西

(.*\p{N}.*)&&(?!19\d\d|20[0-1]\d)\d{4}

但我不确定如何使用AND运算符。

2 个答案:

答案 0 :(得分:1)

这是:

private void button1_Click(object sender, EventArgs e)
    { 
        int i = 0;
        List<int> ChkedRow = new List<int>();

        for (i = 0; i <= dataGridView1.RowCount - 1; i++)
        {
            if (Convert.ToBoolean(dataGridView1.Rows[i].Cells["Column1"].Value) == true)
            {
                ChkedRow.Add(i);
            }
        }

        if (ChkedRow.Count == 0)
        {
            MessageBox.Show("Select Items to view report");
            return;
        }

        foreach (int j in ChkedRow)
        {
            String ConnectionString1 = @"Data Source=.\SQLEXPRESS;Initial Catalog=tempdb;Integrated Security=True;Pooling=False";

            cnnStr = @"create table ##gridtemp (itmcod varchar(7)) INSERT INTO ##gridtemp (itmcod)
                        VALUES ('" + dataGridView1.Rows[j].Cells["title"].Value.ToString() + "');";

            try
            {
                using (SqlConnection cs = new SqlConnection(ConnectionString1))
                {

                    using (cmd = new SqlCommand(cnnStr, cs))
                    {
                        cs.Open();
                        cmd.ExecuteNonQuery();
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        MessageBox.Show("Records Added Succesfully");
    }

你想要一个字符串:

  • ^(?!.*19\d\d.*)(?!.*20[01]\d.*)(.*\p{N}.*)$ 不包含19xx
  • (?!.*19\d\d.*)不包含200x或201x
  • (?!.*20[01]\d.*)包含,至少,一位数

正则表达式(.*\p{N}+.*)表示,文字&&而不是&&运算符

如果您想捕获不在and范围内的数字,可以替换为:

1900-2019

您可以对其进行测试here

答案 1 :(得分:0)

虽然托马斯的解决方案可能是最好的解决方案,但另一个选择是没有否定:只需选择匹配的所有内容:

re = /\D(
  [03-9]\d*|
  (?:1|2|20)(?=\D)|
  1[0-8]\d*|
  19\d?(?=\D)|
  19\d{3,}|
  20[2-9]\d*|
  20[01]?(?=\D)|
  20[01]\d{2,}
)/x

▶ 'Here 2014 and 1945 and 1878 and 20000 and 2 and 19 and 195 and 203'.scan re
#⇒ [["1878"], ["20000"], ["2"], ["19"], ["195"], ["203"]]